From ef20f2928ea1214e74a1258e99486feb8da14a23 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 3 Nov 2015 08:39:23 +0100 Subject: [PATCH] 00fbdc6dc1f23a7f5362fbdba2c4e12e99a96e5a --- dist/index.html | 6 +-- dist/js/app-loader.js | 2 +- dist/js/app.js | 4 +- dist/js/maps/app.js.map | 2 +- dist/js/templates.js | 16 +++---- dist/locales/locale-ca.json | 61 ++++++++++++++------------- dist/locales/locale-de.json | 3 +- dist/locales/locale-en.json | 3 +- dist/locales/locale-es.json | 5 ++- dist/locales/locale-fi.json | 3 +- dist/locales/locale-fr.json | 13 +++--- dist/locales/locale-it.json | 13 +++--- dist/locales/locale-nl.json | 59 +++++++++++++------------- dist/locales/locale-pl.json | 3 +- dist/locales/locale-pt-br.json | 3 +- dist/locales/locale-ru.json | 3 +- dist/locales/locale-zh-hant.json | 3 +- dist/styles/theme-high-contrast.css | 4 +- dist/styles/theme-material-design.css | 4 +- dist/styles/theme-taiga.css | 4 +- dist/svg/logo-moustache.svg | 15 +++++++ generate.sh | 2 + 22 files changed, 130 insertions(+), 101 deletions(-) create mode 100644 dist/svg/logo-moustache.svg create mode 100755 generate.sh diff --git a/dist/index.html b/dist/index.html index 22670ab..5bbf730 100644 --- a/dist/index.html +++ b/dist/index.html @@ -88,8 +88,8 @@
- - - + + + \ No newline at end of file diff --git a/dist/js/app-loader.js b/dist/js/app-loader.js index 8c40eef..46e2f02 100644 --- a/dist/js/app-loader.js +++ b/dist/js/app-loader.js @@ -1,7 +1,7 @@ (function() { var promise, version; - version = 1446455071045; + version = 1446536297279; window.taigaConfig = { "api": "http://localhost:8000/api/v1/", diff --git a/dist/js/app.js b/dist/js/app.js index a0c3b9c..a85e194 100644 --- a/dist/js/app.js +++ b/dist/js/app.js @@ -29426,13 +29426,13 @@ translate_params: ['username', 'field_name', 'obj_name', 'new_value'] }, { check: function(timeline, event) { - return event.obj === 'task' && event.type === 'change' && !timeline.getIn('data', 'task', 'userstory') && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff'; + return event.obj === 'task' && event.type === 'change' && !timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff'; }, key: 'TIMELINE.TASK_UPDATED', translate_params: ['username', 'field_name', 'obj_name'] }, { check: function(timeline, event) { - return event.obj === 'task' && event.type === 'change' && timeline.getIn('data', 'task', 'userstory') && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff'; + return event.obj === 'task' && event.type === 'change' && timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff'; }, key: 'TIMELINE.TASK_UPDATED_WITH_US', translate_params: ['username', 'field_name', 'obj_name', 'us_name'] diff --git a/dist/js/maps/app.js.map b/dist/js/maps/app.js.map index 8c7f7fd..17412ba 100644 --- a/dist/js/maps/app.js.map +++ b/dist/js/maps/app.js.map @@ -1 +1 @@ -{"version":3,"sources":["coffee/app.coffee","coffee/classes.coffee","coffee/utils.coffee","coffee/modules/controllerMixins.coffee","coffee/modules/admin.coffee","coffee/modules/auth.coffee","coffee/modules/backlog.coffee","coffee/modules/base.coffee","coffee/modules/common.coffee","coffee/modules/events.coffee","coffee/modules/feedback.coffee","coffee/modules/integrations.coffee","coffee/modules/issues.coffee","coffee/modules/kanban.coffee","coffee/modules/projects.coffee","coffee/modules/related-tasks.coffee","coffee/modules/resources.coffee","coffee/modules/search.coffee","coffee/modules/taskboard.coffee","coffee/modules/tasks.coffee","coffee/modules/team.coffee","coffee/modules/user-settings.coffee","coffee/modules/userstories.coffee","coffee/modules/wiki.coffee","coffee/modules/common/analytics.coffee","coffee/modules/common/attachments.coffee","coffee/modules/common/bind-scope.coffee","coffee/modules/common/compile-html.directive.coffee","coffee/modules/common/components.coffee","coffee/modules/common/confirm.coffee","coffee/modules/common/custom-field-values.coffee","coffee/modules/common/estimation.coffee","coffee/modules/common/filters.coffee","coffee/modules/common/history.coffee","coffee/modules/common/importer.coffee","coffee/modules/common/lightboxes.coffee","coffee/modules/common/loader.coffee","coffee/modules/common/loading.coffee","coffee/modules/common/popovers.coffee","coffee/modules/common/raven-logger.coffee","coffee/modules/common/tags.coffee","coffee/modules/common/wisiwyg.coffee","coffee/modules/backlog/filters.coffee","coffee/modules/backlog/lightboxes.coffee","coffee/modules/backlog/main.coffee","coffee/modules/backlog/sortable.coffee","coffee/modules/backlog/sprints.coffee","coffee/modules/taskboard/charts.coffee","coffee/modules/taskboard/lightboxes.coffee","coffee/modules/taskboard/main.coffee","coffee/modules/taskboard/sortable.coffee","coffee/modules/kanban/main.coffee","coffee/modules/kanban/sortable.coffee","coffee/modules/issues/detail.coffee","coffee/modules/issues/lightboxes.coffee","coffee/modules/issues/list.coffee","coffee/modules/userstories/detail.coffee","coffee/modules/tasks/detail.coffee","coffee/modules/team/main.coffee","coffee/modules/wiki/main.coffee","coffee/modules/wiki/nav.coffee","coffee/modules/admin/lightboxes.coffee","coffee/modules/admin/memberships.coffee","coffee/modules/admin/nav.coffee","coffee/modules/admin/project-profile.coffee","coffee/modules/admin/project-values.coffee","coffee/modules/admin/roles.coffee","coffee/modules/admin/third-parties.coffee","coffee/modules/projects/lightboxes.coffee","coffee/modules/base/bind.coffee","coffee/modules/base/conf.coffee","coffee/modules/base/contrib.coffee","coffee/modules/base/filters.coffee","coffee/modules/base/http.coffee","coffee/modules/base/location.coffee","coffee/modules/base/model.coffee","coffee/modules/base/navurls.coffee","coffee/modules/base/repository.coffee","coffee/modules/base/storage.coffee","coffee/modules/base/urls.coffee","coffee/modules/resources/attachments.coffee","coffee/modules/resources/custom-attributes-values.coffee","coffee/modules/resources/custom-attributes.coffee","coffee/modules/resources/history.coffee","coffee/modules/resources/invitations.coffee","coffee/modules/resources/issues.coffee","coffee/modules/resources/kanban.coffee","coffee/modules/resources/locales.coffee","coffee/modules/resources/mdrender.coffee","coffee/modules/resources/memberships.coffee","coffee/modules/resources/modules.coffee","coffee/modules/resources/notify-policies.coffee","coffee/modules/resources/projects.coffee","coffee/modules/resources/roles.coffee","coffee/modules/resources/search.coffee","coffee/modules/resources/sprints.coffee","coffee/modules/resources/tasks.coffee","coffee/modules/resources/user-settings.coffee","coffee/modules/resources/users.coffee","coffee/modules/resources/userstories.coffee","coffee/modules/resources/webhooklogs.coffee","coffee/modules/resources/webhooks.coffee","coffee/modules/resources/wiki.coffee","coffee/modules/user-settings/change-password.coffee","coffee/modules/user-settings/lightboxes.coffee","coffee/modules/user-settings/main.coffee","coffee/modules/user-settings/nav.coffee","coffee/modules/user-settings/notifications.coffee","modules/components/components.module.coffee","modules/external-apps/external-apps.module.coffee","modules/home/home.module.coffee","modules/navigation-bar/navigation-bar.module.coffee","modules/profile/profile.module.coffee","modules/projects/projects.module.coffee","modules/resources/resources.module.coffee","modules/user-timeline/user-timeline.module.coffee","modules/components/joy-ride/joy-ride.directive.coffee","modules/components/joy-ride/joy-ride.service.coffee","modules/components/project-menu/project-menu.controller.coffee","modules/components/project-menu/project-menu.directive.coffee","modules/components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.directive.coffee","modules/components/vote-button/vote-button.controller.coffee","modules/components/vote-button/vote-button.directive.coffee","modules/components/watch-button/watch-button.controller.coffee","modules/components/watch-button/watch-button.directive.coffee","modules/external-apps/external-app.controller.coffee","modules/external-apps/external-app.service.coffee","modules/feedback/feedback.service.coffee","modules/home/duties/duty.directive.coffee","modules/home/home.service.coffee","modules/home/projects/home-project-list.directive.coffee","modules/home/working-on/working-on.controller.coffee","modules/home/working-on/working-on.directive.coffee","modules/navigation-bar/dropdown-project-list/dropdown-project-list.directive.coffee","modules/navigation-bar/dropdown-user/dropdown-user.directive.coffee","modules/navigation-bar/navigation-bar.directive.coffee","modules/navigation-bar/navigation-bar.service.coffee","modules/profile/profile-bar/profile-bar.controller.coffee","modules/profile/profile-bar/profile-bar.directive.coffee","modules/profile/profile-contacts/profile-contacts.controller.coffee","modules/profile/profile-contacts/profile-contacts.directive.coffee","modules/profile/profile-favs/items/items.directive.coffee","modules/profile/profile-favs/profile-favs.controller.coffee","modules/profile/profile-favs/profile-favs.directive.coffee","modules/profile/profile-hints/profile-hints.controller.coffee","modules/profile/profile-hints/profile-hints.directive.coffee","modules/profile/profile-projects/profile-projects.controller.coffee","modules/profile/profile-projects/profile-projects.directive.coffee","modules/profile/profile-tab/profile-tab.directive.coffee","modules/profile/profile-tabs/profile-tabs.controller.coffee","modules/profile/profile-tabs/profile-tabs.directive.coffee","modules/profile/profile.controller.coffee","modules/projects/components/like-project-button/like-project-button.controller.coffee","modules/projects/components/like-project-button/like-project-button.directive.coffee","modules/projects/components/like-project-button/like-project-button.service.coffee","modules/projects/components/sort-projects.directive.coffee","modules/projects/components/watch-project-button/watch-project-button.controller.coffee","modules/projects/components/watch-project-button/watch-project-button.directive.coffee","modules/projects/components/watch-project-button/watch-project-button.service.coffee","modules/projects/listing/projects-listing.controller.coffee","modules/projects/project/project.controller.coffee","modules/projects/projects.service.coffee","modules/resources/external-apps-resource.service.coffee","modules/resources/issues-resource.service.coffee","modules/resources/projects-resource.service.coffee","modules/resources/resources.coffee","modules/resources/tasks-resource.service.coffee","modules/resources/user-resource.service.coffee","modules/resources/users-resource.service.coffee","modules/resources/userstories-resource.service.coffee","modules/services/app-meta.service.coffee","modules/services/check-permissions.service.coffee","modules/services/current-user.service.coffee","modules/services/lightbox-factory.service.coffee","modules/services/paginate-response.service.coffee","modules/services/project.service.coffee","modules/services/scope-event.service.coffee","modules/services/theme.service.coffee","modules/services/user.service.coffee","modules/services/xhrError.service.coffee","modules/user-timeline/user-timeline-attachment/user-timeline-attachment.directive.coffee","modules/user-timeline/user-timeline-item/user-timeline-item-title.service.coffee","modules/user-timeline/user-timeline-item/user-timeline-item-type.service.coffee","modules/user-timeline/user-timeline-item/user-timeline-item.directive.coffee","modules/user-timeline/user-timeline-pagination-sequence/user-timeline-pagination-sequence.service.coffee","modules/user-timeline/user-timeline/user-timeline.controller.coffee","modules/user-timeline/user-timeline/user-timeline.directive.coffee","modules/user-timeline/user-timeline/user-timeline.service.coffee","plugins/main.coffee"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACniBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACldA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACn2CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5qBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC58BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1sBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAmBA,sBAAA,GAAyB,SAAC,kBAAD,EAAqB,oBAArB,EAA2C,SAA3C;AACrB,QAAA;IAAA,IAAA,GAAO,SAAC,KAAD,EAAQ,EAAR,EAAY,KAAZ,EAAmB,IAAnB;MACH,KAAK,CAAC,EAAN,GAAW;MAEX,KAAK,CAAC,GAAN,CAAU,qBAAV,EAAiC,SAAA;QAC7B,IAAG,SAAS,CAAC,IAAV,CAAA,CAAA,KAAoB,GAAvB;iBACI,KAAK,CAAC,EAAE,CAAC,MAAT,GAAkB,KADtB;SAAA,MAAA;iBAGI,KAAK,CAAC,EAAE,CAAC,MAAT,GAAkB,MAHtB;;MAD6B,CAAjC;MAMA,KAAK,CAAC,uBAAN,CAA8B,KAAK,CAAC,EAApC,EAAwC,UAAxC,EAAoD,SAAA;eAAM,kBAAkB,CAAC,QAAQ,CAAC,GAA5B,CAAgC,SAAhC;MAAN,CAApD;MACA,KAAK,CAAC,uBAAN,CAA8B,KAAK,CAAC,EAApC,EAAwC,iBAAxC,EAA2D,SAAA;eAAM,kBAAkB,CAAC,eAAnB,CAAA;MAAN,CAA3D;aACA,KAAK,CAAC,uBAAN,CAA8B,KAAK,CAAC,EAApC,EAAwC,iBAAxC,EAA2D,SAAA;eAAM,oBAAoB,CAAC,eAArB,CAAA;MAAN,CAA3D;IAXG;IAcP,SAAA,GAAY;MACR,WAAA,EAAa,oCADL;MAER,KAAA,EAAO,EAFC;MAGR,IAAA,EAAM,IAHE;;AAMZ,WAAO;EArBc;;EAuBzB,sBAAsB,CAAC,OAAvB,GAAiC,CAC7B,sBAD6B,EAE7B,wBAF6B,EAG7B,WAH6B;;EAMjC,OAAO,CAAC,MAAR,CAAe,oBAAf,CAAoC,CAAC,SAArC,CAA+C,iBAA/C,EAAkE,sBAAlE;AAhDA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAmBA,wBAAA,GAA2B,SAAA;AACvB,QAAA;IAAA,IAAA,GAAO,SAAC,KAAD,EAAQ,GAAR,EAAa,KAAb,EAAoB,IAApB;aACH,IAAI,CAAC,YAAL,CAAA;IADG;AAGP,WAAO;MACH,WAAA,EAAa,gDADV;MAEH,KAAA,EAAO;QACH,IAAA,EAAM,GADH;OAFJ;MAKH,YAAA,EAAc,IALX;MAMH,UAAA,EAAY,iBANT;MAOH,IAAA,EAAM,IAPH;MAQH,gBAAA,EAAkB,IARf;;EAJgB;;EAe3B,OAAO,CAAC,MAAR,CAAe,cAAf,CAA8B,CAAC,SAA/B,CAAyC,mBAAzC,EAA8D,wBAA9D;AAlCA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAmBA,QAAA,GAAW,SAAC,WAAD,EAAc,IAAd;AACP,QAAA;IAAA,OAAA,GAAU;IAEV,OAAO,CAAC,mBAAR,GAA8B,SAAC,aAAD,EAAgB,KAAhB;AAC1B,UAAA;MAAA,GAAA,GAAM,WAAW,CAAC,OAAZ,CAAoB,cAApB;MACN,GAAA,GAAS,GAAD,GAAK,GAAL,GAAQ,aAAR,GAAsB,eAAtB,GAAqC;AAC7C,aAAO,IAAI,CAAC,GAAL,CAAS,GAAT,CAAa,CAAC,IAAd,C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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAmBA,KAAA,GAAQ,IAAC,CAAC;;EAEV,QAAA,GAAW,KAAK,CAAC;;EAGX;IACF,cAAC,CAAC,OAAF,GAAY,CACR,YADQ;;IAIC,wBAAC,SAAD;MAAC,IAAC,CAAA,YAAD;IAAD;;6BAEb,IAAA,GAAM,SAAC,GAAD,EAAM,KAAN;AACF,UAAA;MAAA,IAAU,CAAI,GAAd;AAAA,eAAA;;MAEA,IAAG,GAAA,KAAO,OAAV;QACI,IAAA,GAAO,CAAA,CAAE,OAAF;QAEP,IAAG,IAAI,CAAC,MAAL,KAAe,CAAlB;UACI,IAAA,GAAO,CAAA,CAAE,iBAAF;UACP,CAAA,CAAE,MAAF,CAAS,CAAC,MAAV,CAAiB,IAAjB,EAFJ;;eAIA,IAAI,CAAC,IAAL,CAAU,KAAA,IAAS,EAAnB,EAPJ;OAAA,MAQK,IAAG,GAA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","file":"app.js","sourcesContent":["###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: app.coffee\n###\n\n@taiga = taiga = {}\n@.taigaContribPlugins = @.taigaContribPlugins or []\n\n# Generic function for generate hash from a arbitrary length\n# collection of parameters.\ntaiga.generateHash = (components=[]) ->\n components = _.map(components, (x) -> JSON.stringify(x))\n return hex_sha1(components.join(\":\"))\n\n\ntaiga.generateUniqueSessionIdentifier = ->\n date = (new Date()).getTime()\n randomNumber = Math.floor(Math.random() * 0x9000000)\n return taiga.generateHash([date, randomNumber])\n\n\ntaiga.sessionId = taiga.generateUniqueSessionIdentifier()\n\n\nconfigure = ($routeProvider, $locationProvider, $httpProvider, $provide, $tgEventsProvider,\n $compileProvider, $translateProvider, $animateProvider) ->\n\n $animateProvider.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/)\n\n # wait until the trasnlation is ready to resolve the page\n originalWhen = $routeProvider.when\n\n $routeProvider.when = (path, route) ->\n route.resolve || (route.resolve = {})\n angular.extend(route.resolve, {\n languageLoad: [\"$q\", \"$translate\", ($q, $translate) ->\n deferred = $q.defer()\n\n $translate().then () -> deferred.resolve()\n\n return deferred.promise\n ]\n })\n\n return originalWhen.call($routeProvider, path, route)\n\n $routeProvider.when(\"/\",\n {\n templateUrl: \"home/home.html\",\n access: {\n requiresLogin: true\n },\n loader: true,\n title: \"HOME.PAGE_TITLE\",\n loader: true,\n description: \"HOME.PAGE_DESCRIPTION\",\n joyride: \"dashboard\"\n }\n )\n\n $routeProvider.when(\"/projects/\",\n {\n templateUrl: \"projects/listing/projects-listing.html\",\n access: {\n requiresLogin: true\n },\n title: \"PROJECTS.PAGE_TITLE\",\n description: \"PROJECTS.PAGE_DESCRIPTION\",\n loader: true,\n controller: \"ProjectsListing\",\n controllerAs: \"vm\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/\",\n {\n templateUrl: \"projects/project/project.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\"\n section: \"project-timeline\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/search\",\n {\n templateUrl: \"search/search.html\",\n reloadOnSearch: false,\n section: \"search\",\n loader: true\n }\n )\n\n $routeProvider.when(\"/project/:pslug/backlog\",\n {\n templateUrl: \"backlog/backlog.html\",\n loader: true,\n section: \"backlog\",\n joyride: \"backlog\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/kanban\",\n {\n templateUrl: \"kanban/kanban.html\",\n loader: true,\n section: \"kanban\",\n joyride: \"kanban\"\n }\n )\n\n # Milestone\n $routeProvider.when(\"/project/:pslug/taskboard/:sslug\",\n {\n templateUrl: \"taskboard/taskboard.html\",\n loader: true,\n section: \"backlog\"\n }\n )\n\n # User stories\n $routeProvider.when(\"/project/:pslug/us/:usref\",\n {\n templateUrl: \"us/us-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n }\n )\n\n # Tasks\n $routeProvider.when(\"/project/:pslug/task/:taskref\",\n {\n templateUrl: \"task/task-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n }\n )\n\n # Wiki\n $routeProvider.when(\"/project/:pslug/wiki\",\n {redirectTo: (params) -> \"/project/#{params.pslug}/wiki/home\"}, )\n $routeProvider.when(\"/project/:pslug/wiki/:slug\",\n {\n templateUrl: \"wiki/wiki.html\",\n loader: true,\n section: \"wiki\"\n }\n )\n\n # Team\n $routeProvider.when(\"/project/:pslug/team\",\n {\n templateUrl: \"team/team.html\",\n loader: true,\n section: \"team\"\n }\n )\n\n # Issues\n $routeProvider.when(\"/project/:pslug/issues\",\n {\n templateUrl: \"issue/issues.html\",\n loader: true,\n section: \"issues\"\n }\n )\n $routeProvider.when(\"/project/:pslug/issue/:issueref\",\n {\n templateUrl: \"issue/issues-detail.html\",\n loader: true,\n section: \"issues\"\n }\n )\n\n # Admin - Project Profile\n $routeProvider.when(\"/project/:pslug/admin/project-profile/details\",\n {\n templateUrl: \"admin/admin-project-profile.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-profile/default-values\",\n {\n templateUrl: \"admin/admin-project-default-values.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-profile/modules\",\n {\n templateUrl: \"admin/admin-project-modules.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-profile/export\",\n {\n templateUrl: \"admin/admin-project-export.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-profile/reports\",\n {\n templateUrl: \"admin/admin-project-reports.html\",\n section: \"admin\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/admin/project-values/status\",\n {\n templateUrl: \"admin/admin-project-values-status.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/points\",\n {\n templateUrl: \"admin/admin-project-values-points.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/priorities\",\n {\n templateUrl: \"admin/admin-project-values-priorities.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/severities\",\n {\n templateUrl: \"admin/admin-project-values-severities.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/types\",\n {\n templateUrl: \"admin/admin-project-values-types.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/custom-fields\",\n {\n templateUrl: \"admin/admin-project-values-custom-fields.html\",\n section: \"admin\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/admin/memberships\",\n {\n templateUrl: \"admin/admin-memberships.html\",\n section: \"admin\"\n }\n )\n # Admin - Roles\n $routeProvider.when(\"/project/:pslug/admin/roles\",\n {\n templateUrl: \"admin/admin-roles.html\",\n section: \"admin\"\n }\n )\n\n # Admin - Third Parties\n $routeProvider.when(\"/project/:pslug/admin/third-parties/webhooks\",\n {\n templateUrl: \"admin/admin-third-parties-webhooks.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/third-parties/github\",\n {\n templateUrl: \"admin/admin-third-parties-github.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/third-parties/gitlab\",\n {\n templateUrl: \"admin/admin-third-parties-gitlab.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/third-parties/bitbucket\",\n {\n templateUrl: \"admin/admin-third-parties-bitbucket.html\",\n section: \"admin\"\n }\n )\n # Admin - Contrib Plugins\n $routeProvider.when(\"/project/:pslug/admin/contrib/:plugin\",\n {templateUrl: \"contrib/main.html\"})\n\n # User settings\n $routeProvider.when(\"/user-settings/user-profile\",\n {templateUrl: \"user/user-profile.html\"})\n $routeProvider.when(\"/user-settings/user-change-password\",\n {templateUrl: \"user/user-change-password.html\"})\n $routeProvider.when(\"/user-settings/mail-notifications\",\n {templateUrl: \"user/mail-notifications.html\"})\n $routeProvider.when(\"/change-email/:email_token\",\n {templateUrl: \"user/change-email.html\"})\n $routeProvider.when(\"/cancel-account/:cancel_token\",\n {templateUrl: \"user/cancel-account.html\"})\n\n # User profile\n $routeProvider.when(\"/profile\",\n {\n templateUrl: \"profile/profile.html\",\n loader: true,\n access: {\n requiresLogin: true\n },\n controller: \"Profile\",\n controllerAs: \"vm\"\n }\n )\n\n $routeProvider.when(\"/profile/:slug\",\n {\n templateUrl: \"profile/profile.html\",\n loader: true,\n controller: \"Profile\",\n controllerAs: \"vm\"\n }\n )\n\n # Auth\n $routeProvider.when(\"/login\",\n {\n templateUrl: \"auth/login.html\",\n title: \"LOGIN.PAGE_TITLE\",\n description: \"LOGIN.PAGE_DESCRIPTION\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/register\",\n {\n templateUrl: \"auth/register.html\",\n title: \"REGISTER.PAGE_TITLE\",\n description: \"REGISTER.PAGE_DESCRIPTION\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/forgot-password\",\n {\n templateUrl: \"auth/forgot-password.html\",\n title: \"FORGOT_PASSWORD.PAGE_TITLE\",\n description: \"FORGOT_PASSWORD.PAGE_DESCRIPTION\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/change-password/:token\",\n {\n templateUrl: \"auth/change-password-from-recovery.html\",\n title: \"CHANGE_PASSWORD.PAGE_TITLE\",\n description: \"CHANGE_PASSWORD.PAGE_TITLE\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/invitation/:token\",\n {\n templateUrl: \"auth/invitation.html\",\n title: \"INVITATION.PAGE_TITLE\",\n description: \"INVITATION.PAGE_DESCRIPTION\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/external-apps\",\n {\n templateUrl: \"external-apps/external-app.html\",\n title: \"EXTERNAL_APP.PAGE_TITLE\",\n description: \"EXTERNAL_APP.PAGE_DESCRIPTION\",\n controller: \"ExternalApp\",\n controllerAs: \"vm\",\n disableHeader: true,\n mobileViewport: true\n }\n )\n\n # Errors/Exceptions\n $routeProvider.when(\"/error\",\n {templateUrl: \"error/error.html\"})\n $routeProvider.when(\"/not-found\",\n {templateUrl: \"error/not-found.html\"})\n $routeProvider.when(\"/permission-denied\",\n {templateUrl: \"error/permission-denied.html\"})\n\n $routeProvider.otherwise({redirectTo: \"/not-found\"})\n $locationProvider.html5Mode({enabled: true, requireBase: false})\n\n defaultHeaders = {\n \"Content-Type\": \"application/json\"\n \"Accept-Language\": window.taigaConfig.defaultLanguage || \"en\"\n \"X-Session-Id\": taiga.sessionId\n }\n\n $httpProvider.defaults.headers.delete = defaultHeaders\n $httpProvider.defaults.headers.patch = defaultHeaders\n $httpProvider.defaults.headers.post = defaultHeaders\n $httpProvider.defaults.headers.put = defaultHeaders\n $httpProvider.defaults.headers.get = {\n \"X-Session-Id\": taiga.sessionId\n }\n\n $httpProvider.useApplyAsync(true)\n\n $tgEventsProvider.setSessionId(taiga.sessionId)\n\n # Add next param when user try to access to a secction need auth permissions.\n authHttpIntercept = ($q, $location, $navUrls, $lightboxService) ->\n httpResponseError = (response) ->\n if response.status == 0 || response.status == -1\n $lightboxService.closeAll()\n $location.path($navUrls.resolve(\"error\"))\n $location.replace()\n else if response.status == 401 and $location.url().indexOf('/login') == -1\n nextUrl = encodeURIComponent($location.url())\n $location.url($navUrls.resolve(\"login\")).search(\"next=#{nextUrl}\")\n\n return $q.reject(response)\n\n return {\n responseError: httpResponseError\n }\n\n $provide.factory(\"authHttpIntercept\", [\"$q\", \"$location\", \"$tgNavUrls\", \"lightboxService\",\n authHttpIntercept])\n\n $httpProvider.interceptors.push(\"authHttpIntercept\")\n\n\n loaderIntercept = ($q, loaderService) ->\n return {\n request: (config) ->\n loaderService.logRequest()\n\n return config\n\n requestError: (rejection) ->\n loaderService.logResponse()\n\n return $q.reject(rejection)\n\n responseError: (rejection) ->\n loaderService.logResponse()\n\n return $q.reject(rejection)\n\n response: (response) ->\n loaderService.logResponse()\n\n return response\n }\n\n\n $provide.factory(\"loaderIntercept\", [\"$q\", \"tgLoader\", loaderIntercept])\n\n $httpProvider.interceptors.push(\"loaderIntercept\")\n\n # If there is an error in the version throw a notify error.\n # IMPROVEiMENT: Move this version error handler to USs, issues and tasks repository\n versionCheckHttpIntercept = ($q) ->\n httpResponseError = (response) ->\n if response.status == 400 && response.data.version\n # HACK: to prevent circular dependencies with [$tgConfirm, $translate]\n $injector = angular.element(\"body\").injector()\n $injector.invoke([\"$tgConfirm\", \"$translate\", ($confirm, $translate) =>\n versionErrorMsg = $translate.instant(\"ERROR.VERSION_ERROR\")\n $confirm.notify(\"error\", versionErrorMsg, null, 10000)\n ])\n\n return $q.reject(response)\n\n return {responseError: httpResponseError}\n\n $provide.factory(\"versionCheckHttpIntercept\", [\"$q\", versionCheckHttpIntercept])\n\n $httpProvider.interceptors.push(\"versionCheckHttpIntercept\")\n\n window.checksley.updateValidators({\n linewidth: (val, width) ->\n lines = taiga.nl2br(val).split(\"
\")\n\n valid = _.every lines, (line) ->\n line.length < width\n\n return valid\n })\n\n $compileProvider.debugInfoEnabled(window.taigaConfig.debugInfo || false)\n\n if localStorage.userInfo\n userInfo = JSON.parse(localStorage.userInfo)\n\n # i18n\n preferedLangCode = userInfo?.lang || window.taigaConfig.defaultLanguage || \"en\"\n\n $translateProvider\n .useStaticFilesLoader({\n prefix: \"/locales/locale-\",\n suffix: \".json\"\n })\n .addInterpolation('$translateMessageFormatInterpolation')\n .preferredLanguage(preferedLangCode)\n\n $translateProvider.fallbackLanguage(preferedLangCode)\n\n # decoratos\n decorators = _.where(@.taigaContribPlugins, {\"type\": \"decorator\"})\n\n _.each decorators, (decorator) ->\n $provide.decorator decorator.provider, decorator.decorator\n\n # decoratos\n decorators = _.where(@.taigaContribPlugins, {\"type\": \"decorator\"})\n\n _.each decorators, (decorator) ->\n $provide.decorator decorator.provider, decorator.decorator\n\ni18nInit = (lang, $translate) ->\n # i18n - moment.js\n moment.locale(lang)\n\n # i18n - checksley.js\n messages = {\n defaultMessage: $translate.instant(\"COMMON.FORM_ERRORS.DEFAULT_MESSAGE\")\n type: {\n email: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_EMAIL\")\n url: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URL\")\n urlstrict: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URLSTRICT\")\n number: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_NUMBER\")\n digits: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DIGITS\")\n dateIso: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DATEISO\")\n alphanum: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_ALPHANUM\")\n phone: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_PHONE\")\n }\n notnull: $translate.instant(\"COMMON.FORM_ERRORS.NOTNULL\")\n notblank: $translate.instant(\"COMMON.FORM_ERRORS.NOT_BLANK\")\n required: $translate.instant(\"COMMON.FORM_ERRORS.REQUIRED\")\n regexp: $translate.instant(\"COMMON.FORM_ERRORS.REGEXP\")\n min: $translate.instant(\"COMMON.FORM_ERRORS.MIN\")\n max: $translate.instant(\"COMMON.FORM_ERRORS.MAX\")\n range: $translate.instant(\"COMMON.FORM_ERRORS.RANGE\")\n minlength: $translate.instant(\"COMMON.FORM_ERRORS.MIN_LENGTH\")\n maxlength: $translate.instant(\"COMMON.FORM_ERRORS.MAX_LENGTH\")\n rangelength: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_LENGTH\")\n mincheck: $translate.instant(\"COMMON.FORM_ERRORS.MIN_CHECK\")\n maxcheck: $translate.instant(\"COMMON.FORM_ERRORS.MAX_CHECK\")\n rangecheck: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_CHECK\")\n equalto: $translate.instant(\"COMMON.FORM_ERRORS.EQUAL_TO\")\n }\n checksley.updateMessages('default', messages)\n\n\ninit = ($log, $rootscope, $auth, $events, $analytics, $translate, $location, $navUrls, appMetaService, projectService, loaderService, navigationBarService) ->\n $log.debug(\"Initialize application\")\n\n # Taiga Plugins\n $rootscope.contribPlugins = @.taigaContribPlugins\n $rootscope.adminPlugins = _.where(@.taigaContribPlugins, {\"type\": \"admin\"})\n\n $rootscope.$on \"$translateChangeEnd\", (e, ctx) ->\n lang = ctx.language\n i18nInit(lang, $translate)\n\n # bluebird\n Promise.setScheduler (cb) ->\n $rootscope.$evalAsync(cb)\n\n # Load user\n if $auth.isAuthenticated()\n $events.setupConnection()\n user = $auth.getUser()\n\n # Analytics\n $analytics.initialize()\n\n # On the first page load the loader is painted in `$routeChangeSuccess`\n # because we need to hide the tg-navigation-bar.\n # In the other cases the loader is in `$routeChangeSuccess`\n # because `location.noreload` prevent to execute this event.\n un = $rootscope.$on '$routeChangeStart', (event, next) ->\n if next.loader\n loaderService.start(true)\n\n un()\n\n $rootscope.$on '$routeChangeSuccess', (event, next) ->\n if next.loader\n loaderService.start(true)\n\n if next.access && next.access.requiresLogin\n if !$auth.isAuthenticated()\n $location.path($navUrls.resolve(\"login\"))\n\n projectService.setSection(next.section)\n\n if next.params.pslug\n projectService.setProjectBySlug(next.params.pslug)\n else\n projectService.cleanProject()\n\n if next.title or next.description\n title = $translate.instant(next.title or \"\")\n description = $translate.instant(next.description or \"\")\n appMetaService.setAll(title, description)\n\n if next.mobileViewport\n appMetaService.addMobileViewport()\n else\n appMetaService.removeMobileViewport()\n\n if next.disableHeader\n navigationBarService.disableHeader()\n else\n navigationBarService.enableHeader()\n\npluginsWithModule = _.filter(@.taigaContribPlugins, (plugin) -> plugin.module)\n\npluginsWithModule = _.filter(@.taigaContribPlugins, (plugin) -> plugin.module)\n\nmodules = [\n # Main Global Modules\n \"taigaBase\",\n \"taigaCommon\",\n \"taigaResources\",\n \"taigaResources2\",\n \"taigaAuth\",\n \"taigaEvents\",\n\n # Specific Modules\n \"taigaHome\",\n \"taigaNavigationBar\",\n \"taigaProjects\",\n \"taigaRelatedTasks\",\n \"taigaBacklog\",\n \"taigaTaskboard\",\n \"taigaKanban\",\n \"taigaIssues\",\n \"taigaUserStories\",\n \"taigaTasks\",\n \"taigaTeam\",\n \"taigaWiki\",\n \"taigaSearch\",\n \"taigaAdmin\",\n \"taigaProject\",\n \"taigaUserSettings\",\n \"taigaFeedback\",\n \"taigaPlugins\",\n \"taigaIntegrations\",\n \"taigaComponents\",\n # new modules\n \"taigaProfile\",\n \"taigaHome\",\n \"taigaUserTimeline\",\n \"taigaExternalApps\",\n\n # template cache\n \"templates\",\n\n # Vendor modules\n \"ngRoute\",\n \"ngAnimate\",\n \"ngAria\",\n \"pascalprecht.translate\",\n \"infinite-scroll\",\n \"tgRepeat\"\n].concat(_.map(pluginsWithModule, (plugin) -> plugin.module))\n\n# Main module definition\nmodule = angular.module(\"taiga\", modules)\n\nmodule.config([\n \"$routeProvider\",\n \"$locationProvider\",\n \"$httpProvider\",\n \"$provide\",\n \"$tgEventsProvider\",\n \"$compileProvider\",\n \"$translateProvider\",\n \"$animateProvider\",\n configure\n])\n\nmodule.run([\n \"$log\",\n \"$rootScope\",\n \"$tgAuth\",\n \"$tgEvents\",\n \"$tgAnalytics\",\n \"$translate\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"tgProjectService\",\n \"tgLoader\",\n \"tgNavigationBarService\",\n \"$route\",\n init\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: classes.coffee\n###\n\nclass TaigaBase\nclass TaigaService extends TaigaBase\nclass TaigaController extends TaigaBase\n onInitialDataError: (xhr) =>\n if xhr\n if xhr.status == 404\n @location.path(@navUrls.resolve(\"not-found\"))\n @location.replace()\n else if xhr.status == 403\n @location.path(@navUrls.resolve(\"permission-denied\"))\n @location.replace()\n\n return @q.reject(xhr)\n\n@.taiga.Base = TaigaBase\n@.taiga.Service = TaigaService\n@.taiga.Controller = TaigaController\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: utils.coffee\n###\n\nnl2br = (str) =>\n breakTag = '
'\n return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1' + breakTag + '$2')\n\nbindMethods = (object) =>\n dependencies = _.keys(object)\n\n methods = []\n\n _.forIn object, (value, key) =>\n if key not in dependencies\n methods.push(key)\n\n _.bindAll(object, methods)\n\nbindOnce = (scope, attr, continuation) =>\n val = scope.$eval(attr)\n if val != undefined\n return continuation(val)\n\n delBind = null\n delBind = scope.$watch attr, (val) ->\n return if val is undefined\n continuation(val)\n delBind() if delBind\n\n\nmixOf = (base, mixins...) ->\n class Mixed extends base\n\n for mixin in mixins by -1 #earlier mixins override later ones\n for name, method of mixin::\n Mixed::[name] = method\n Mixed\n\n\ntrim = (data, char) ->\n return _.str.trim(data, char)\n\n\nslugify = (data) ->\n return _.str.slugify(data)\n\n\nunslugify = (data) ->\n if data\n return _.str.capitalize(data.replace(/-/g, ' '))\n return data\n\n\ntoggleText = (element, texts) ->\n nextTextPosition = element.data('nextTextPosition')\n nextTextPosition = 0 if not nextTextPosition? or nextTextPosition >= texts.length\n text = texts[nextTextPosition]\n element.data('nextTextPosition', nextTextPosition + 1)\n element.text(text)\n\n\ngroupBy = (coll, pred) ->\n result = {}\n for item in coll\n result[pred(item)] = item\n\n return result\n\n\ntimeout = (wait, continuation) ->\n return window.setTimeout(continuation, wait)\n\n\ncancelTimeout = (timeoutVar) ->\n window.clearTimeout(timeoutVar)\n\n\nscopeDefer = (scope, func) ->\n _.defer =>\n scope.$apply(func)\n\n\ntoString = (value) ->\n if _.isNumber(value)\n return value + \"\"\n else if _.isString(value)\n return value\n else if _.isPlainObject(value)\n return JSON.stringify(value)\n else if _.isUndefined(value)\n return \"\"\n return value.toString()\n\n\njoinStr = (str, coll) ->\n return _.str.join(str, coll)\n\n\ndebounce = (wait, func) ->\n return _.debounce(func, wait, {leading: true, trailing: false})\n\n\ndebounceLeading = (wait, func) ->\n return _.debounce(func, wait, {leading: false, trailing: true})\n\n\nstartswith = (str1, str2) ->\n return _.str.startsWith(str1, str2)\n\n\ntruncate = (str, maxLength, suffix=\"...\") ->\n return str if (typeof str != \"string\") and not (str instanceof String)\n\n out = str.slice(0)\n\n if out.length > maxLength\n out = out.substring(0, maxLength + 1)\n out = out.substring(0, Math.min(out.length, out.lastIndexOf(\" \")))\n out = out + suffix\n\n return out\n\n\nsizeFormat = (input, precision=1) ->\n if isNaN(parseFloat(input)) or not isFinite(input)\n return \"-\"\n\n if input == 0\n return \"0 bytes\"\n\n units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"]\n number = Math.floor(Math.log(input) / Math.log(1024))\n if number > 5\n number = 5\n size = (input / Math.pow(1024, number)).toFixed(precision)\n return \"#{size} #{units[number]}\"\n\nstripTags = (str, exception) ->\n if exception\n pattern = new RegExp('<(?!' + exception + '\\s*\\/?)[^>]+>', 'gi')\n return String(str).replace(pattern, '')\n else\n return String(str).replace(/<\\/?[^>]+>/g, '')\n\nreplaceTags = (str, tags, replace) ->\n # open tag\n pattern = new RegExp('<(' + tags + ')>', 'gi')\n str = str.replace(pattern, '<' + replace + '>')\n\n # close tag\n pattern = new RegExp('<\\/(' + tags + ')>', 'gi')\n str = str.replace(pattern, '')\n\n return str\n\ndefineImmutableProperty = (obj, name, fn) =>\n Object.defineProperty obj, name, {\n get: () =>\n if !_.isFunction(fn)\n throw \"defineImmutableProperty third param must be a function\"\n\n fn_result = fn()\n if fn_result && _.isObject(fn_result)\n if fn_result.size == undefined\n throw \"defineImmutableProperty must return immutable data\"\n\n return fn_result\n }\n\n_.mixin\n removeKeys: (obj, keys) ->\n _.chain([keys]).flatten().reduce(\n (obj, key) ->\n delete obj[key]; obj\n , obj).value()\n\ntaiga = @.taiga\ntaiga.nl2br = nl2br\ntaiga.bindMethods = bindMethods\ntaiga.bindOnce = bindOnce\ntaiga.mixOf = mixOf\ntaiga.trim = trim\ntaiga.slugify = slugify\ntaiga.unslugify = unslugify\ntaiga.toggleText = toggleText\ntaiga.groupBy = groupBy\ntaiga.timeout = timeout\ntaiga.cancelTimeout = cancelTimeout\ntaiga.scopeDefer = scopeDefer\ntaiga.toString = toString\ntaiga.joinStr = joinStr\ntaiga.truncate = truncate\ntaiga.debounce = debounce\ntaiga.debounceLeading = debounceLeading\ntaiga.startswith = startswith\ntaiga.sizeFormat = sizeFormat\ntaiga.stripTags = stripTags\ntaiga.replaceTags = replaceTags\ntaiga.defineImmutableProperty = defineImmutableProperty\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/controllerMixins.coffee\n###\n\ntaiga = @.taiga\n\ngroupBy = @.taiga.groupBy\njoinStr = @.taiga.joinStr\ntrim = @.taiga.trim\ntoString = @.taiga.toString\n\n\n#############################################################################\n## Page Mixin\n#############################################################################\n\nclass PageMixin\n fillUsersAndRoles: (users, roles) ->\n activeUsers = _.filter(users, (user) => user.is_active)\n @scope.activeUsers = _.sortBy(activeUsers, \"full_name_display\")\n @scope.activeUsersById = groupBy(@scope.activeUsers, (e) -> e.id)\n\n @scope.users = _.sortBy(users, \"full_name_display\")\n @scope.usersById = groupBy(@scope.users, (e) -> e.id)\n\n @scope.roles = _.sortBy(roles, \"order\")\n computableRoles = _(@scope.project.members).map(\"role\").uniq().value()\n @scope.computableRoles = _(roles).filter(\"computable\")\n .filter((x) -> _.contains(computableRoles, x.id))\n .value()\n loadUsersAndRoles: ->\n promise = @q.all([\n @rs.projects.usersList(@scope.projectId),\n @rs.projects.rolesList(@scope.projectId)\n ])\n\n return promise.then (results) =>\n [users, roles] = results\n @.fillUsersAndRoles(users, roles)\n return results\n\ntaiga.PageMixin = PageMixin\n\n\n#############################################################################\n## Filters Mixin\n#############################################################################\n# This mixin requires @location ($tgLocation), and @scope\n\nclass FiltersMixin\n selectFilter: (name, value, load=false) ->\n params = @location.search()\n if params[name] != undefined and name != \"page\"\n existing = _.map(taiga.toString(params[name]).split(\",\"), (x) -> trim(x))\n existing.push(taiga.toString(value))\n existing = _.compact(existing)\n value = joinStr(\",\", _.uniq(existing))\n\n if !@location.isInCurrentRouteParams(name, value)\n location = if load then @location else @location.noreload(@scope)\n location.search(name, value)\n\n replaceFilter: (name, value, load=false) ->\n if !@location.isInCurrentRouteParams(name, value)\n location = if load then @location else @location.noreload(@scope)\n location.search(name, value)\n\n replaceAllFilters: (filters, load=false) ->\n location = if load then @location else @location.noreload(@scope)\n location.search(filters)\n\n unselectFilter: (name, value, load=false) ->\n params = @location.search()\n\n if params[name] is undefined\n return\n\n if value is undefined or value is null\n delete params[name]\n\n parsedValues = _.map(taiga.toString(params[name]).split(\",\"), (x) -> trim(x))\n newValues = _.reject(parsedValues, (x) -> x == taiga.toString(value))\n newValues = _.compact(newValues)\n\n if _.isEmpty(newValues)\n value = null\n else\n value = joinStr(\",\", _.uniq(newValues))\n\n location = if load then @location else @location.noreload(@scope)\n location.search(name, value)\n\ntaiga.FiltersMixin = FiltersMixin\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin.coffee\n###\n\nmodule = angular.module(\"taigaAdmin\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/auth.coffee\n###\n\ntaiga = @.taiga\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaAuth\", [\"taigaResources\"])\n\n#############################################################################\n## Authentication Service\n#############################################################################\n\nclass AuthService extends taiga.Service\n @.$inject = [\"$rootScope\",\n \"$tgStorage\",\n \"$tgModel\",\n \"$tgResources\",\n \"$tgHttp\",\n \"$tgUrls\",\n \"$tgConfig\",\n \"$translate\",\n \"tgCurrentUserService\",\n \"tgThemeService\"]\n\n constructor: (@rootscope, @storage, @model, @rs, @http, @urls, @config, @translate, @currentUserService,\n @themeService) ->\n super()\n\n @._currentTheme = @config.get(\"defaultTheme\") || \"taiga\" # load on index.jade\n\n userModel = @.getUser()\n @.setUserdata(userModel)\n\n setUserdata: (userModel) ->\n if userModel\n @.userData = Immutable.fromJS(userModel.getAttrs())\n @currentUserService.setUser(@.userData)\n else\n @.userData = null\n\n _getUserTheme: ->\n return @rootscope.user?.theme || @config.get(\"defaultTheme\") || \"taiga\"\n\n _setTheme: ->\n newTheme = @._getUserTheme()\n\n if @._currentTheme != newTheme\n @._currentTheme = newTheme\n @themeService.use(@._currentTheme)\n\n _setLocales: ->\n lang = @rootscope.user?.lang || @config.get(\"defaultLanguage\") || \"en\"\n @translate.preferredLanguage(lang) # Needed for calls to the api in the correct language\n @translate.use(lang) # Needed for change the interface in runtime\n\n getUser: ->\n if @rootscope.user\n return @rootscope.user\n\n userData = @storage.get(\"userInfo\")\n if userData\n user = @model.make_model(\"users\", userData)\n @rootscope.user = user\n @._setLocales()\n\n @._setTheme()\n\n return user\n\n return null\n\n setUser: (user) ->\n @rootscope.auth = user\n @storage.set(\"userInfo\", user.getAttrs())\n @rootscope.user = user\n\n @.setUserdata(user)\n\n @._setLocales()\n @._setTheme()\n\n clear: ->\n @rootscope.auth = null\n @rootscope.user = null\n @storage.remove(\"userInfo\")\n\n setToken: (token) ->\n @storage.set(\"token\", token)\n\n getToken: ->\n return @storage.get(\"token\")\n\n removeToken: ->\n @storage.remove(\"token\")\n\n isAuthenticated: ->\n if @.getUser() != null\n return true\n return false\n\n ## Http interface\n\n login: (data, type) ->\n url = @urls.resolve(\"auth\")\n\n data = _.clone(data, false)\n data.type = if type then type else \"normal\"\n\n @.removeToken()\n\n return @http.post(url, data).then (data, status) =>\n user = @model.make_model(\"users\", data.data)\n @.setToken(user.auth_token)\n @.setUser(user)\n return user\n\n logout: ->\n @.removeToken()\n @.clear()\n @currentUserService.removeUser()\n\n @._setTheme()\n @._setLocales()\n\n\n register: (data, type, existing) ->\n url = @urls.resolve(\"auth-register\")\n\n data = _.clone(data, false)\n data.type = if type then type else \"public\"\n if type == \"private\"\n data.existing = if existing then existing else false\n\n @.removeToken()\n\n return @http.post(url, data).then (response) =>\n user = @model.make_model(\"users\", response.data)\n @.setToken(user.auth_token)\n @.setUser(user)\n return user\n\n getInvitation: (token) ->\n return @rs.invitations.get(token)\n\n acceptInvitiationWithNewUser: (data) ->\n return @.register(data, \"private\", false)\n\n acceptInvitiationWithExistingUser: (data) ->\n return @.register(data, \"private\", true)\n\n forgotPassword: (data) ->\n url = @urls.resolve(\"users-password-recovery\")\n data = _.clone(data, false)\n @.removeToken()\n return @http.post(url, data)\n\n changePasswordFromRecovery: (data) ->\n url = @urls.resolve(\"users-change-password-from-recovery\")\n data = _.clone(data, false)\n @.removeToken()\n return @http.post(url, data)\n\n changeEmail: (data) ->\n url = @urls.resolve(\"users-change-email\")\n data = _.clone(data, false)\n return @http.post(url, data)\n\n cancelAccount: (data) ->\n url = @urls.resolve(\"users-cancel-account\")\n data = _.clone(data, false)\n return @http.post(url, data)\n\nmodule.service(\"$tgAuth\", AuthService)\n\n\n#############################################################################\n## Login Directive\n#############################################################################\n\n# Directive that manages the visualization of public register\n# message/link on login page.\n\nPublicRegisterMessageDirective = ($config, $navUrls, templates) ->\n template = templates.get(\"auth/login-text.html\", true)\n\n templateFn = ->\n publicRegisterEnabled = $config.get(\"publicRegisterEnabled\")\n if not publicRegisterEnabled\n return \"\"\n return template({url:$navUrls.resolve(\"register\")})\n\n return {\n restrict: \"AE\"\n scope: {}\n template: templateFn\n }\n\nmodule.directive(\"tgPublicRegisterMessage\", [\"$tgConfig\", \"$tgNavUrls\", \"$tgTemplate\",\n PublicRegisterMessageDirective])\n\n\nLoginDirective = ($auth, $confirm, $location, $config, $routeParams, $navUrls, $events, $translate) ->\n link = ($scope, $el, $attrs) ->\n onSuccess = (response) ->\n if $routeParams['next'] and $routeParams['next'] != $navUrls.resolve(\"login\")\n nextUrl = decodeURIComponent($routeParams['next'])\n else\n nextUrl = $navUrls.resolve(\"home\")\n\n $events.setupConnection()\n $location.url(nextUrl)\n\n onError = (response) ->\n $confirm.notify(\"light-error\", $translate.instant(\"LOGIN_FORM.ERROR_AUTH_INCORRECT\"))\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = new checksley.Form($el.find(\"form.login-form\"))\n if not form.validate()\n return\n\n data = {\n \"username\": $el.find(\"form.login-form input[name=username]\").val(),\n \"password\": $el.find(\"form.login-form input[name=password]\").val()\n }\n\n loginFormType = $config.get(\"loginFormType\", \"normal\")\n\n promise = $auth.login(data, loginFormType)\n return promise.then(onSuccess, onError)\n\n $el.on \"submit\", \"form\", submit\n\n window.prerenderReady = true\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgLogin\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgConfig\", \"$routeParams\",\n \"$tgNavUrls\", \"$tgEvents\", \"$translate\", LoginDirective])\n\n\n#############################################################################\n## Register Directive\n#############################################################################\n\nRegisterDirective = ($auth, $confirm, $location, $navUrls, $config, $analytics, $translate) ->\n link = ($scope, $el, $attrs) ->\n if not $config.get(\"publicRegisterEnabled\")\n $location.path($navUrls.resolve(\"not-found\"))\n $location.replace()\n\n $scope.data = {}\n form = $el.find(\"form\").checksley({onlyOneErrorElement: true})\n\n onSuccessSubmit = (response) ->\n $analytics.trackEvent(\"auth\", \"register\", \"user registration\", 1)\n\n $confirm.notify(\"success\", $translate.instant(\"LOGIN_FORM.SUCCESS\"))\n\n $location.path($navUrls.resolve(\"home\"))\n\n onErrorSubmit = (response) ->\n if response.data._error_message\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {error: response.data._error_message})\n $confirm.notify(\"light-error\", text)\n\n form.setErrors(response.data)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n promise = $auth.register($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n window.prerenderReady = true\n\n return {link:link}\n\nmodule.directive(\"tgRegister\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfig\",\n \"$tgAnalytics\", \"$translate\", RegisterDirective])\n\n\n#############################################################################\n## Forgot Password Directive\n#############################################################################\n\nForgotPasswordDirective = ($auth, $confirm, $location, $navUrls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $scope.data = {}\n form = $el.find(\"form\").checksley()\n\n onSuccessSubmit = (response) ->\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS\")\n $confirm.success(text)\n\n onErrorSubmit = (response) ->\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.ERROR\")\n\n $confirm.notify(\"light-error\", text)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n promise = $auth.forgotPassword($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n window.prerenderReady = true\n\n return {link:link}\n\nmodule.directive(\"tgForgotPassword\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$translate\",\n ForgotPasswordDirective])\n\n\n#############################################################################\n## Change Password from Recovery Directive\n#############################################################################\n\nChangePasswordFromRecoveryDirective = ($auth, $confirm, $location, $params, $navUrls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $scope.data = {}\n\n if $params.token?\n $scope.tokenInParams = true\n $scope.data.token = $params.token\n else\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\")\n $confirm.notify(\"light-error\",text)\n\n form = $el.find(\"form\").checksley()\n\n onSuccessSubmit = (response) ->\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS\")\n $confirm.success(text)\n\n onErrorSubmit = (response) ->\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\")\n $confirm.notify(\"light-error\", text)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n promise = $auth.changePasswordFromRecovery($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgChangePasswordFromRecovery\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\",\n \"$tgNavUrls\", \"$translate\",\n ChangePasswordFromRecoveryDirective])\n\n\n#############################################################################\n## Invitation\n#############################################################################\n\nInvitationDirective = ($auth, $confirm, $location, $params, $navUrls, $analytics, $translate) ->\n link = ($scope, $el, $attrs) ->\n token = $params.token\n\n promise = $auth.getInvitation(token)\n promise.then (invitation) ->\n $scope.invitation = invitation\n\n promise.then null, (response) ->\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"INVITATION_LOGIN_FORM.NOT_FOUND\")\n $confirm.notify(\"light-error\", text)\n\n # Login form\n $scope.dataLogin = {token: token}\n loginForm = $el.find(\"form.login-form\").checksley({onlyOneErrorElement: true})\n\n onSuccessSubmitLogin = (response) ->\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with existing user\", 1)\n $location.path($navUrls.resolve(\"project\", {project: $scope.invitation.project_slug}))\n text = $translate.instant(\"INVITATION_LOGIN_FORM.SUCCESS\", {\n \"project_name\": $scope.invitation.project_name\n })\n\n $confirm.notify(\"success\", text)\n\n onErrorSubmitLogin = (response) ->\n text = $translate.instant(\"INVITATION_LOGIN_FORM.ERROR\")\n\n $confirm.notify(\"light-error\", text)\n\n submitLogin = debounce 2000, (event) =>\n event.preventDefault()\n\n if not loginForm.validate()\n return\n\n promise = $auth.acceptInvitiationWithExistingUser($scope.dataLogin)\n promise.then(onSuccessSubmitLogin, onErrorSubmitLogin)\n\n $el.on \"submit\", \"form.login-form\", submitLogin\n $el.on \"click\", \".button-login\", submitLogin\n\n # Register form\n $scope.dataRegister = {token: token}\n registerForm = $el.find(\"form.register-form\").checksley({onlyOneErrorElement: true})\n\n onSuccessSubmitRegister = (response) ->\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with new user\", 1)\n $location.path($navUrls.resolve(\"project\", {project: $scope.invitation.project_slug}))\n $confirm.notify(\"success\", \"You've successfully joined this project\",\n \"Welcome to #{_.escape($scope.invitation.project_name)}\")\n\n onErrorSubmitRegister = (response) ->\n if response.data._error_message\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {error: response.data._error_message})\n $confirm.notify(\"light-error\", text)\n\n registerForm.setErrors(response.data)\n\n submitRegister = debounce 2000, (event) =>\n event.preventDefault()\n\n if not registerForm.validate()\n return\n\n promise = $auth.acceptInvitiationWithNewUser($scope.dataRegister)\n promise.then(onSuccessSubmitRegister, onErrorSubmitRegister)\n\n $el.on \"submit\", \"form.register-form\", submitRegister\n $el.on \"click\", \".button-register\", submitRegister\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgInvitation\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\",\n \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", InvitationDirective])\n\n\n#############################################################################\n## Change Email\n#############################################################################\n\nChangeEmailDirective = ($repo, $model, $auth, $confirm, $location, $params, $navUrls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $scope.data = {}\n $scope.data.email_token = $params.email_token\n form = $el.find(\"form\").checksley()\n\n onSuccessSubmit = (response) ->\n if $auth.isAuthenticated()\n $repo.queryOne(\"users\", $auth.getUser().id).then (data) =>\n $auth.setUser(data)\n $location.path($navUrls.resolve(\"home\"))\n else\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"CHANGE_EMAIL_FORM.SUCCESS\")\n $confirm.success(text)\n\n onErrorSubmit = (response) ->\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {error: response.data._error_message})\n\n $confirm.notify(\"light-error\", text)\n\n submit = ->\n if not form.validate()\n return\n\n promise = $auth.changeEmail($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", (event) ->\n event.preventDefault()\n submit()\n\n $el.on \"click\", \"a.button-change-email\", (event) ->\n event.preventDefault()\n submit()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgChangeEmail\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\",\n \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangeEmailDirective])\n\n\n#############################################################################\n## Cancel account\n#############################################################################\n\nCancelAccountDirective = ($repo, $model, $auth, $confirm, $location, $params, $navUrls) ->\n link = ($scope, $el, $attrs) ->\n $scope.data = {}\n $scope.data.cancel_token = $params.cancel_token\n form = $el.find(\"form\").checksley()\n\n onSuccessSubmit = (response) ->\n $auth.logout()\n $location.path($navUrls.resolve(\"home\"))\n\n text = $translate.instant(\"CANCEL_ACCOUNT.SUCCESS\")\n\n $confirm.success(text)\n\n onErrorSubmit = (response) ->\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {error: response.data._error_message})\n\n $confirm.notify(\"error\", text)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n promise = $auth.cancelAccount($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgCancelAccount\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\",\n \"$routeParams\",\"$tgNavUrls\", CancelAccountDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog.coffee\n###\n\nmodule = angular.module(\"taigaBacklog\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base.coffee\n###\n\ntaiga = @.taiga\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaBase\", [])\n\n#############################################################################\n## Main Directive\n#############################################################################\n\nTaigaMainDirective = ($rootscope, $window) ->\n link = ($scope, $el, $attrs) ->\n $window.onresize = () ->\n $rootscope.$broadcast(\"resize\")\n\n return {link:link}\n\nmodule.directive(\"tgMain\", [\"$rootScope\", \"$window\", TaigaMainDirective])\n\n#############################################################################\n## Navigation\n#############################################################################\n\nurls = {\n \"home\": \"/\"\n \"projects\": \"/projects\"\n \"error\": \"/error\"\n \"not-found\": \"/not-found\"\n \"permission-denied\": \"/permission-denied\"\n\n \"login\": \"/login\"\n \"forgot-password\": \"/forgot-password\"\n \"change-password\": \"/change-password/:token\"\n \"change-email\": \"/change-email/:token\"\n \"cancel-account\": \"/cancel-account/:token\"\n \"register\": \"/register\"\n \"invitation\": \"/invitation/:token\"\n \"create-project\": \"/create-project\"\n\n \"profile\": \"/profile\"\n \"user-profile\": \"/profile/:username\"\n\n \"project\": \"/project/:project\"\n \"project-backlog\": \"/project/:project/backlog\"\n \"project-taskboard\": \"/project/:project/taskboard/:sprint\"\n \"project-kanban\": \"/project/:project/kanban\"\n \"project-issues\": \"/project/:project/issues\"\n \"project-search\": \"/project/:project/search\"\n\n \"project-userstories-detail\": \"/project/:project/us/:ref\"\n \"project-tasks-detail\": \"/project/:project/task/:ref\"\n \"project-issues-detail\": \"/project/:project/issue/:ref\"\n\n \"project-wiki\": \"/project/:project/wiki\"\n \"project-wiki-page\": \"/project/:project/wiki/:slug\"\n\n # Team\n \"project-team\": \"/project/:project/team\"\n\n # Admin\n \"project-admin-home\": \"/project/:project/admin/project-profile/details\"\n \"project-admin-project-profile-details\": \"/project/:project/admin/project-profile/details\"\n \"project-admin-project-profile-default-values\": \"/project/:project/admin/project-profile/default-values\"\n \"project-admin-project-profile-modules\": \"/project/:project/admin/project-profile/modules\"\n \"project-admin-project-profile-export\": \"/project/:project/admin/project-profile/export\"\n \"project-admin-project-profile-reports\": \"/project/:project/admin/project-profile/reports\"\n\n \"project-admin-project-values-status\": \"/project/:project/admin/project-values/status\"\n \"project-admin-project-values-points\": \"/project/:project/admin/project-values/points\"\n \"project-admin-project-values-priorities\": \"/project/:project/admin/project-values/priorities\"\n \"project-admin-project-values-severities\": \"/project/:project/admin/project-values/severities\"\n \"project-admin-project-values-types\": \"/project/:project/admin/project-values/types\"\n \"project-admin-project-values-custom-fields\": \"/project/:project/admin/project-values/custom-fields\"\n\n \"project-admin-memberships\": \"/project/:project/admin/memberships\"\n \"project-admin-roles\": \"/project/:project/admin/roles\"\n \"project-admin-third-parties-webhooks\": \"/project/:project/admin/third-parties/webhooks\"\n \"project-admin-third-parties-github\": \"/project/:project/admin/third-parties/github\"\n \"project-admin-third-parties-gitlab\": \"/project/:project/admin/third-parties/gitlab\"\n \"project-admin-third-parties-bitbucket\": \"/project/:project/admin/third-parties/bitbucket\"\n \"project-admin-contrib\": \"/project/:project/admin/contrib/:plugin\"\n\n # User settings\n \"user-settings-user-profile\": \"/user-settings/user-profile\"\n \"user-settings-user-change-password\": \"/user-settings/user-change-password\"\n \"user-settings-user-avatar\": \"/user-settings/user-avatar\"\n \"user-settings-mail-notifications\": \"/user-settings/mail-notifications\"\n\n}\n\ninit = ($log, $navurls) ->\n $log.debug \"Initialize navigation urls\"\n $navurls.update(urls)\n\nmodule.run([\"$log\", \"$tgNavUrls\", init])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common.coffee\n###\n\ntaiga = @.taiga\n\nmodule = angular.module(\"taigaCommon\", [])\n\n#############################################################################\n## Default datepicker config\n#############################################################################\nDataPickerConfig = ($translate) ->\n return {\n get: () ->\n return {\n i18n: {\n previousMonth: $translate.instant(\"COMMON.PICKERDATE.PREV_MONTH\"),\n nextMonth: $translate.instant(\"COMMON.PICKERDATE.NEXT_MONTH\"),\n months: [\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.JAN\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.FEB\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAR\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.APR\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAY\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUN\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUL\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.AUG\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.SEP\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.OCT\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.NOV\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.DEC\")\n ],\n weekdays: [\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SUN\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.MON\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.TUE\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.WED\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.THU\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.FRI\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SAT\")\n ],\n weekdaysShort: [\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SUN\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.MON\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.TUE\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.WED\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.THU\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.FRI\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SAT\")\n ]\n },\n isRTL: $translate.instant(\"COMMON.PICKERDATE.IS_RTL\") == \"true\",\n firstDay: parseInt($translate.instant(\"COMMON.PICKERDATE.FIRST_DAY_OF_WEEK\"), 10),\n format: $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n }\n }\n\nmodule.factory(\"tgDatePickerConfigService\", [\"$translate\", DataPickerConfig])\n\n#############################################################################\n## Get the selected text\n#############################################################################\nSelectedText = ($window, $document) ->\n get = () ->\n if $window.getSelection\n return $window.getSelection().toString()\n else if $document.selection\n return $document.selection.createRange().text\n return \"\"\n\n return {get: get}\n\nmodule.factory(\"$selectedText\", [\"$window\", \"$document\", SelectedText])\n\n#############################################################################\n## Permission directive, hide elements when necessary\n#############################################################################\n\nCheckPermissionDirective = ->\n render = ($el, project, permission) ->\n $el.removeClass('hidden') if project.my_permissions.indexOf(permission) > -1\n\n link = ($scope, $el, $attrs) ->\n $el.addClass('hidden')\n permission = $attrs.tgCheckPermission\n\n $scope.$watch \"project\", (project) ->\n render($el, project, permission) if project?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgCheckPermission\", CheckPermissionDirective)\n\n#############################################################################\n## Add class based on permissions\n#############################################################################\n\nClassPermissionDirective = ->\n name = \"tgClassPermission\"\n\n link = ($scope, $el, $attrs) ->\n checkPermissions = (project, className, permission) ->\n negation = permission[0] == \"!\"\n\n permission = permission.slice(1) if negation\n\n if negation && project.my_permissions.indexOf(permission) == -1\n $el.addClass(className)\n else if !negation && project.my_permissions.indexOf(permission) != -1\n $el.addClass(className)\n else\n $el.removeClass(className)\n\n tgClassPermissionWatchAction = (project) ->\n if project\n unbindWatcher()\n\n classes = $scope.$eval($attrs[name])\n\n for className, permission of classes\n checkPermissions(project, className, permission)\n\n\n unbindWatcher = $scope.$watch \"project\", tgClassPermissionWatchAction\n\n return {link:link}\n\nmodule.directive(\"tgClassPermission\", ClassPermissionDirective)\n\n#############################################################################\n## Animation frame service, apply css changes in the next render frame\n#############################################################################\nAnimationFrame = () ->\n animationFrame =\n window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame\n\n performAnimation = (time) =>\n fn = tail.shift()\n fn()\n\n if (tail.length)\n animationFrame(performAnimation)\n\n tail = []\n\n add = () ->\n for fn in arguments\n tail.push(fn)\n\n if tail.length == 1\n animationFrame(performAnimation)\n\n return {add: add}\n\nmodule.factory(\"animationFrame\", AnimationFrame)\n\n#############################################################################\n## Open/close comment\n#############################################################################\n\nToggleCommentDirective = () ->\n link = ($scope, $el, $attrs) ->\n $el.find(\"textarea\").on \"focus\", () ->\n $el.addClass(\"active\")\n\n return {link:link}\n\nmodule.directive(\"tgToggleComment\", ToggleCommentDirective)\n\n\n#############################################################################\n## Get the appropiate section url for a project\n## according to his enabled modules and user permisions\n#############################################################################\n\nProjectUrl = ($navurls) ->\n get = (project) ->\n ctx = {project: project.slug}\n\n if project.is_backlog_activated and project.my_permissions.indexOf(\"view_us\") > -1\n return $navurls.resolve(\"project-backlog\", ctx)\n if project.is_kanban_activated and project.my_permissions.indexOf(\"view_us\") > -1\n return $navurls.resolve(\"project-kanban\", ctx)\n if project.is_wiki_activated and project.my_permissions.indexOf(\"view_wiki_pages\") > -1\n return $navurls.resolve(\"project-wiki\", ctx)\n if project.is_issues_activated and project.my_permissions.indexOf(\"view_issues\") > -1\n return $navurls.resolve(\"project-issues\", ctx)\n\n return $navurls.resolve(\"project\", ctx)\n\n return {get: get}\n\nmodule.factory(\"$projectUrl\", [\"$tgNavUrls\", ProjectUrl])\n\n\n#############################################################################\n## Limite line size in a text area\n#############################################################################\n\nLimitLineLengthDirective = () ->\n link = ($scope, $el, $attrs) ->\n maxColsPerLine = parseInt($el.attr(\"cols\"))\n $el.on \"keyup\", (event) ->\n code = event.keyCode\n lines = $el.val().split(\"\\n\")\n\n _.each lines, (line, index) ->\n lines[index] = line.substring(0, maxColsPerLine - 2)\n\n $el.val(lines.join(\"\\n\"))\n\n return {link:link}\n\nmodule.directive(\"tgLimitLineLength\", LimitLineLengthDirective)\n\n#############################################################################\n## Queue Q promises\n#############################################################################\n\nQqueue = ($q) ->\n deferred = $q.defer()\n deferred.resolve()\n\n lastPromise = deferred.promise\n\n qqueue = {\n bindAdd: (fn) =>\n return (args...) =>\n lastPromise = lastPromise.then () => fn.apply(@, args)\n\n return qqueue\n add: (fn) =>\n if !lastPromise\n lastPromise = fn()\n else\n lastPromise = lastPromise.then(fn)\n\n return qqueue\n }\n\n return qqueue\n\nmodule.factory(\"$tgQqueue\", [\"$q\", Qqueue])\n\n#############################################################################\n## Templates\n#############################################################################\n\nTemplate = ($templateCache) ->\n return {\n get: (name, lodash = false) =>\n tmp = $templateCache.get(name)\n\n if lodash\n tmp = _.template(tmp)\n\n return tmp\n }\n\nmodule.factory(\"$tgTemplate\", [\"$templateCache\", Template])\n\n#############################################################################\n## Permission directive, hide elements when necessary\n#############################################################################\n\nCapslock = ($translate) ->\n link = ($scope, $el, $attrs) ->\n open = false\n\n warningIcon = $('
')\n .addClass('icon')\n .addClass('icon-capslock')\n .attr('title', $translate.instant('COMMON.CAPSLOCK_WARNING'))\n\n hideIcon = () ->\n warningIcon.fadeOut () ->\n open = false\n\n $(this).remove()\n\n showIcon = (e) ->\n return if open\n element = e.currentTarget\n $(element).parent().append(warningIcon)\n $('.icon-capslock').fadeIn()\n\n open = true\n\n $el.on 'blur', (e) ->\n hideIcon()\n\n $el.on 'keyup.capslock, focus', (e) ->\n if $el.val() == $el.val().toLowerCase()\n hideIcon(e)\n else\n showIcon(e)\n\n $scope.$on \"$destroy\", ->\n $el.off('.capslock')\n\n return {link:link}\n\nmodule.directive(\"tgCapslock\", [\"$translate\", Capslock])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/events.coffee\n###\n\ntaiga = @.taiga\nstartswith = @.taiga.startswith\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaEvents\", [])\n\n\nclass EventsService\n constructor: (@win, @log, @config, @auth) ->\n bindMethods(@)\n\n initialize: (sessionId) ->\n @.sessionId = sessionId\n @.subscriptions = {}\n @.connected = false\n @.error = false\n @.pendingMessages = []\n\n if @win.WebSocket is undefined\n @log.info \"WebSockets not supported on your browser\"\n\n setupConnection: ->\n @.stopExistingConnection()\n\n url = @config.get(\"eventsUrl\")\n\n # This allows disable events in case\n # url is not found on the configuration.\n return if not url\n\n # This allows relative urls in configuration.\n if not startswith(url, \"ws:\") and not startswith(url, \"wss:\")\n loc = @win.location\n scheme = if loc.protocol == \"https:\" then \"wss:\" else \"ws:\"\n path = _.str.ltrim(url, \"/\")\n url = \"#{scheme}//#{loc.host}/#{path}\"\n\n @.ws = new @win.WebSocket(url)\n @.ws.addEventListener(\"open\", @.onOpen)\n @.ws.addEventListener(\"message\", @.onMessage)\n @.ws.addEventListener(\"error\", @.onError)\n @.ws.addEventListener(\"close\", @.onClose)\n\n stopExistingConnection: ->\n if @.ws is undefined\n return\n\n @.ws.removeEventListener(\"open\", @.onOpen)\n @.ws.removeEventListener(\"close\", @.onClose)\n @.ws.removeEventListener(\"error\", @.onError)\n @.ws.removeEventListener(\"message\", @.onMessage)\n @.ws.close()\n\n delete @.ws\n\n serialize: (message) ->\n if _.isObject(message)\n return JSON.stringify(message)\n return message\n\n sendMessage: (message) ->\n @.pendingMessages.push(message)\n\n if not @.connected\n return\n\n messages = _.map(@.pendingMessages, @.serialize)\n @.pendingMessages = []\n\n for msg in messages\n @.ws.send(msg)\n\n subscribe: (scope, routingKey, callback) ->\n if @.error\n return\n\n @log.debug(\"Subscribe to: #{routingKey}\")\n subscription = {\n scope: scope,\n routingKey: routingKey,\n callback: _.debounce(callback, 500, {\"leading\": true, \"trailing\": false})\n }\n\n message = {\n \"cmd\": \"subscribe\",\n \"routing_key\": routingKey\n }\n\n @.subscriptions[routingKey] = subscription\n @.sendMessage(message)\n scope.$on(\"$destroy\", => @.unsubscribe(routingKey))\n\n unsubscribe: (routingKey) ->\n if @.error\n return\n\n @log.debug(\"Unsubscribe from: #{routingKey}\")\n\n message = {\n \"cmd\": \"unsubscribe\",\n \"routing_key\": routingKey\n }\n\n @.sendMessage(message)\n\n onOpen: ->\n @.connected = true\n\n @log.debug(\"WebSocket connection opened\")\n token = @auth.getToken()\n\n message = {\n cmd: \"auth\"\n data: {token: token, sessionId: @.sessionId}\n }\n\n @.sendMessage(message)\n\n onMessage: (event) ->\n @.log.debug \"WebSocket message received: #{event.data}\"\n\n data = JSON.parse(event.data)\n routingKey = data.routing_key\n\n if not @.subscriptions[routingKey]?\n return\n\n subscription = @.subscriptions[routingKey]\n subscription.scope.$apply ->\n subscription.callback(data.data)\n\n onError: (error) ->\n @log.error(\"WebSocket error: #{error}\")\n @.error = true\n\n onClose: ->\n @log.debug(\"WebSocket closed.\")\n @.connected = false\n\n\nclass EventsProvider\n setSessionId: (sessionId) ->\n @.sessionId = sessionId\n\n $get: ($win, $log, $conf, $auth) ->\n service = new EventsService($win, $log, $conf, $auth)\n service.initialize(@.sessionId)\n return service\n\n @.prototype.$get.$inject = [\"$window\", \"$log\", \"$tgConfig\", \"$tgAuth\"]\n\nmodule.provider(\"$tgEvents\", EventsProvider)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/feedback.coffee\n###\n\ntaiga = @.taiga\n\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nmixOf = @.taiga.mixOf\ndebounce = @.taiga.debounce\ntrim = @.taiga.trim\n\nmodule = angular.module(\"taigaFeedback\", [])\n\nFeedbackDirective = ($lightboxService, $repo, $confirm, $loading, feedbackService)->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley()\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.create(\"feedback\", $scope.feedback)\n\n promise.then (data) ->\n currentLoading.finish()\n $lightboxService.close($el)\n $confirm.notify(\"success\", \"\\\\o/ we'll be happy to read your\")\n\n promise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n openLightbox = ->\n $scope.feedback = {}\n $lightboxService.open($el)\n $el.find(\"textarea\").focus()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n openLightbox()\n\n directive = {\n link: link,\n templateUrl: \"common/lightbox-feedback.html\"\n scope: {}\n }\n\n return directive\n\nmodule.directive(\"tgLbFeedback\", [\"lightboxService\", \"$tgRepo\", \"$tgConfirm\",\n \"$tgLoading\", \"tgFeedbackService\", FeedbackDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/integrations.coffee\n###\n\nmodule = angular.module(\"taigaIntegrations\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues.coffee\n###\n\nmodule = angular.module(\"taigaIssues\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/kanban.coffee\n###\n\nmodule = angular.module(\"taigaKanban\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/projects.coffee\n###\n\nmodule = angular.module(\"taigaProject\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/related-tasks.coffee\n###\n\ntaiga = @.taiga\ntrim = @.taiga.trim\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaRelatedTasks\", [])\n\nRelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $template, $translate) ->\n templateView = $template.get(\"task/related-task-row.html\", true)\n templateEdit = $template.get(\"task/related-task-row-edit.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n saveTask = debounce 2000, (task) ->\n task.subject = $el.find('input').val()\n\n currentLoading = $loading()\n .target($el.find('.task-name'))\n .start()\n\n promise = $repo.save(task)\n promise.then =>\n currentLoading.finish()\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"related-tasks:update\")\n\n promise.then null, =>\n currentLoading.finish()\n $el.find('input').val(task.subject)\n $confirm.notify(\"error\")\n return promise\n\n renderEdit = (task) ->\n $el.html($compile(templateEdit({task: task}))($scope))\n\n $el.on \"keyup\", \"input\", (event) ->\n if event.keyCode == 13\n saveTask($model.$modelValue).then ->\n renderView($model.$modelValue)\n else if event.keyCode == 27\n renderView($model.$modelValue)\n\n $el.on \"click\", \".icon-floppy\", (event) ->\n saveTask($model.$modelValue).then ->\n renderView($model.$modelValue)\n\n $el.on \"click\", \".cancel-edit\", (event) ->\n renderView($model.$modelValue)\n\n renderView = (task) ->\n $el.off()\n\n perms = {\n modify_task: $scope.project.my_permissions.indexOf(\"modify_task\") != -1\n delete_task: $scope.project.my_permissions.indexOf(\"delete_task\") != -1\n }\n\n $el.html($compile(templateView({task: task, perms: perms}))($scope))\n\n $el.on \"click\", \".icon-edit\", ->\n renderEdit($model.$modelValue)\n $el.find('input').focus().select()\n\n $el.on \"click\", \".delete-task\", (event) ->\n title = $translate.instant(\"TASK.TITLE_DELETE_ACTION\")\n task = $model.$modelValue\n message = task.subject\n\n $confirm.askOnDelete(title, message).then (askResponse) ->\n promise = $repo.remove(task)\n promise.then ->\n askResponse.finish()\n $confirm.notify(\"success\")\n $scope.$emit(\"related-tasks:delete\")\n\n promise.then null, ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n $scope.$watch $attrs.ngModel, (val) ->\n return if not val\n renderView(val)\n\n $scope.$on \"related-tasks:assigned-to-changed\", ->\n $rootscope.$broadcast(\"related-tasks:update\")\n\n $scope.$on \"related-tasks:status-changed\", ->\n $rootscope.$broadcast(\"related-tasks:update\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link, require:\"ngModel\"}\n\nmodule.directive(\"tgRelatedTaskRow\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"$tgTemplate\", \"$translate\", RelatedTaskRowDirective])\n\nRelatedTaskCreateFormDirective = ($repo, $compile, $confirm, $tgmodel, $loading, $analytics, $template) ->\n template = $template.get(\"task/related-task-create-form.html\", true)\n\n newTask = {\n subject: \"\"\n assigned_to: null\n }\n\n link = ($scope, $el, $attrs) ->\n createTask = debounce 2000, (task) ->\n task.subject = $el.find('input').val()\n task.assigned_to = $scope.newTask.assigned_to\n task.status = $scope.newTask.status\n $scope.newTask.status = $scope.project.default_task_status\n $scope.newTask.assigned_to = null\n\n currentLoading = $loading()\n .target($el.find('.task-name'))\n .start()\n\n promise = $repo.create(\"tasks\", task)\n promise.then ->\n $analytics.trackEvent(\"task\", \"create\", \"create task on userstory\", 1)\n currentLoading.finish()\n $scope.$emit(\"related-tasks:add\")\n $confirm.notify(\"success\")\n\n promise.then null, ->\n $el.find('input').val(task.subject)\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n return promise\n\n close = () ->\n $el.off()\n $el.html(\"\")\n\n $scope.newRelatedTaskFormOpen = false\n\n render = ->\n $scope.newRelatedTaskFormOpen = true\n\n $el.html($compile(template())($scope))\n $el.find('input').focus().select()\n $el.addClass('active')\n\n $el.on \"keyup\", \"input\", (event)->\n if event.keyCode == 13\n createTask(newTask).then ->\n render()\n else if event.keyCode == 27\n $scope.$apply () -> close()\n\n $el.on \"click\", \".icon-delete\", (event)->\n $scope.$apply () -> close()\n\n $el.on \"click\", \".icon-floppy\", (event)->\n createTask(newTask).then ->\n close()\n\n taiga.bindOnce $scope, \"us\", (val) ->\n newTask[\"status\"] = $scope.project.default_task_status\n newTask[\"project\"] = $scope.project.id\n newTask[\"user_story\"] = $scope.us.id\n $scope.newTask = $tgmodel.make_model(\"tasks\", newTask)\n $el.html(\"\")\n\n $scope.$on \"related-tasks:show-form\", ->\n render()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\nmodule.directive(\"tgRelatedTaskCreateForm\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgLoading\", \"$tgAnalytics\", \"$tgTemplate\", RelatedTaskCreateFormDirective])\n\nRelatedTaskCreateButtonDirective = ($repo, $compile, $confirm, $tgmodel) ->\n template = _.template(\"\"\"\n \n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n $scope.$watch \"project\", (val) ->\n return if not val\n $el.off()\n if $scope.project.my_permissions.indexOf(\"add_task\") != -1\n $el.html($compile(template())($scope))\n else\n $el.html(\"\")\n\n $el.on \"click\", \".icon\", (event)->\n $scope.$emit(\"related-tasks:add-new-clicked\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\nmodule.directive(\"tgRelatedTaskCreateButton\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", RelatedTaskCreateButtonDirective])\n\nRelatedTasksDirective = ($repo, $rs, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n loadTasks = ->\n return $rs.tasks.list($scope.projectId, null, $scope.usId).then (tasks) =>\n $scope.tasks = _.sortBy(tasks, 'ref')\n return tasks\n\n $scope.$on \"related-tasks:add\", ->\n loadTasks().then ->\n $rootscope.$broadcast(\"related-tasks:update\")\n\n $scope.$on \"related-tasks:delete\", ->\n loadTasks().then ->\n $rootscope.$broadcast(\"related-tasks:update\")\n\n $scope.$on \"related-tasks:add-new-clicked\", ->\n $scope.$broadcast(\"related-tasks:show-form\")\n\n taiga.bindOnce $scope, \"us\", (val) ->\n loadTasks()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\nmodule.directive(\"tgRelatedTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", RelatedTasksDirective])\n\nRelatedTaskAssignedToInlineEditionDirective = ($repo, $rootscope, popoverService) ->\n template = _.template(\"\"\"\n \" alt=\"<%- name %>\"/>\n
<%- name %>
\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n updateRelatedTask = (task) ->\n ctx = {name: \"Unassigned\", imgurl: \"/images/unnamed.png\"}\n member = $scope.usersById[task.assigned_to]\n if member\n ctx.imgurl = member.photo\n ctx.name = member.full_name_display\n\n $el.find(\".avatar\").html(template(ctx))\n $el.find(\".task-assignedto\").attr('title', ctx.name)\n\n $ctrl = $el.controller()\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition)\n notAutoSave = $scope.$eval($attrs.notAutoSave)\n autoSave = !notAutoSave\n\n updateRelatedTask(task)\n\n $el.on \"click\", \".task-assignedto\", (event) ->\n $rootscope.$broadcast(\"assigned-to:add\", task)\n\n taiga.bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions the click events are unbinded\n if project.my_permissions.indexOf(\"modify_task\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n $scope.$on \"assigned-to:added\", debounce 2000, (ctx, userId, updatedRelatedTask) =>\n if updatedRelatedTask.id == task.id\n updatedRelatedTask.assigned_to = userId\n if autoSave\n $repo.save(updatedRelatedTask).then ->\n $scope.$emit(\"related-tasks:assigned-to-changed\")\n updateRelatedTask(updatedRelatedTask)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgRelatedTaskAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", RelatedTaskAssignedToInlineEditionDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources.coffee\n###\n\ntaiga = @.taiga\n\nclass ResourcesService extends taiga.Service\n\nurls = {\n # Auth\n \"auth\": \"/auth\"\n \"auth-register\": \"/auth/register\"\n \"invitations\": \"/invitations\"\n\n # User\n \"users\": \"/users\"\n \"by_username\": \"/users/by_username\"\n \"users-password-recovery\": \"/users/password_recovery\"\n \"users-change-password-from-recovery\": \"/users/change_password_from_recovery\"\n \"users-change-password\": \"/users/change_password\"\n \"users-change-email\": \"/users/change_email\"\n \"users-cancel-account\": \"/users/cancel\"\n \"user-stats\": \"/users/%s/stats\"\n \"user-liked\": \"/users/%s/liked\"\n \"user-voted\": \"/users/%s/voted\"\n \"user-watched\": \"/users/%s/watched\"\n \"user-contacts\": \"/users/%s/contacts\"\n\n # User - Notification\n \"permissions\": \"/permissions\"\n \"notify-policies\": \"/notify-policies\"\n\n # User - Storage\n \"user-storage\": \"/user-storage\"\n\n # Memberships\n \"memberships\": \"/memberships\"\n \"bulk-create-memberships\": \"/memberships/bulk_create\"\n\n # Roles & Permissions\n \"roles\": \"/roles\"\n \"permissions\": \"/permissions\"\n\n # Resolver\n \"resolver\": \"/resolver\"\n\n # Project\n \"projects\": \"/projects\"\n \"project-templates\": \"/project-templates\"\n \"project-modules\": \"/projects/%s/modules\"\n \"bulk-update-projects-order\": \"/projects/bulk_update_order\"\n \"project-like\": \"/projects/%s/like\"\n \"project-unlike\": \"/projects/%s/unlike\"\n \"project-watch\": \"/projects/%s/watch\"\n \"project-unwatch\": \"/projects/%s/unwatch\"\n\n # Project Values - Choises\n \"userstory-statuses\": \"/userstory-statuses\"\n \"points\": \"/points\"\n \"task-statuses\": \"/task-statuses\"\n \"issue-statuses\": \"/issue-statuses\"\n \"issue-types\": \"/issue-types\"\n \"priorities\": \"/priorities\"\n \"severities\": \"/severities\"\n\n # Milestones/Sprints\n \"milestones\": \"/milestones\"\n\n # User stories\n \"userstories\": \"/userstories\"\n \"bulk-create-us\": \"/userstories/bulk_create\"\n \"bulk-update-us-backlog-order\": \"/userstories/bulk_update_backlog_order\"\n \"bulk-update-us-sprint-order\": \"/userstories/bulk_update_sprint_order\"\n \"bulk-update-us-kanban-order\": \"/userstories/bulk_update_kanban_order\"\n \"userstories-filters\": \"/userstories/filters_data\"\n \"userstory-upvote\": \"/userstories/%s/upvote\"\n \"userstory-downvote\": \"/userstories/%s/downvote\"\n \"userstory-watch\": \"/userstories/%s/watch\"\n \"userstory-unwatch\": \"/userstories/%s/unwatch\"\n\n # Tasks\n \"tasks\": \"/tasks\"\n \"bulk-create-tasks\": \"/tasks/bulk_create\"\n \"bulk-update-task-taskboard-order\": \"/tasks/bulk_update_taskboard_order\"\n \"task-upvote\": \"/tasks/%s/upvote\"\n \"task-downvote\": \"/tasks/%s/downvote\"\n \"task-watch\": \"/tasks/%s/watch\"\n \"task-unwatch\": \"/tasks/%s/unwatch\"\n\n # Issues\n \"issues\": \"/issues\"\n \"bulk-create-issues\": \"/issues/bulk_create\"\n \"issues-filters\": \"/issues/filters_data\"\n \"issue-upvote\": \"/issues/%s/upvote\"\n \"issue-downvote\": \"/issues/%s/downvote\"\n \"issue-watch\": \"/issues/%s/watch\"\n \"issue-unwatch\": \"/issues/%s/unwatch\"\n\n # Wiki pages\n \"wiki\": \"/wiki\"\n \"wiki-restore\": \"/wiki/%s/restore\"\n \"wiki-links\": \"/wiki-links\"\n\n # History\n \"history/us\": \"/history/userstory\"\n \"history/issue\": \"/history/issue\"\n \"history/task\": \"/history/task\"\n \"history/wiki\": \"/history/wiki\"\n\n # Attachments\n \"attachments/us\": \"/userstories/attachments\"\n \"attachments/issue\": \"/issues/attachments\"\n \"attachments/task\": \"/tasks/attachments\"\n \"attachments/wiki_page\": \"/wiki/attachments\"\n\n # Custom Attributess\n \"custom-attributes/userstory\": \"/userstory-custom-attributes\"\n \"custom-attributes/issue\": \"/issue-custom-attributes\"\n \"custom-attributes/task\": \"/task-custom-attributes\"\n\n # Custom Attributess - Values\n \"custom-attributes-values/userstory\": \"/userstories/custom-attributes-values\"\n \"custom-attributes-values/issue\": \"/issues/custom-attributes-values\"\n \"custom-attributes-values/task\": \"/tasks/custom-attributes-values\"\n\n # Webhooks\n \"webhooks\": \"/webhooks\"\n \"webhooks-test\": \"/webhooks/%s/test\"\n \"webhooklogs\": \"/webhooklogs\"\n \"webhooklogs-resend\": \"/webhooklogs/%s/resend\"\n\n # Reports - CSV\n \"userstories-csv\": \"/userstories/csv?uuid=%s\"\n \"tasks-csv\": \"/tasks/csv?uuid=%s\"\n \"issues-csv\": \"/issues/csv?uuid=%s\"\n\n # Timeline\n \"timeline-profile\": \"/timeline/profile\"\n \"timeline-user\": \"/timeline/user\"\n \"timeline-project\": \"/timeline/project\"\n\n # Search\n \"search\": \"/search\"\n\n # Export/Import\n \"exporter\": \"/exporter\"\n \"importer\": \"/importer/load_dump\"\n\n # Feedback\n \"feedback\": \"/feedback\"\n\n # locales\n \"locales\": \"/locales\"\n\n # Application tokens\n \"applications\": \"/applications\"\n \"application-tokens\": \"/application-tokens\"\n}\n\n# Initialize api urls service\ninitUrls = ($log, $urls) ->\n $log.debug \"Initialize api urls\"\n $urls.update(urls)\n\n# Initialize resources service populating it with methods\n# defined in separated files.\ninitResources = ($log, $rs) ->\n $log.debug \"Initialize resources\"\n providers = _.toArray(arguments).slice(2)\n\n for provider in providers\n provider($rs)\n\nmodule = angular.module(\"taigaResources\", [\"taigaBase\"])\nmodule.service(\"$tgResources\", ResourcesService)\n\n# Module entry point\nmodule.run([\"$log\", \"$tgUrls\", initUrls])\nmodule.run([\n \"$log\",\n \"$tgResources\",\n \"$tgProjectsResourcesProvider\",\n \"$tgCustomAttributesResourcesProvider\",\n \"$tgCustomAttributesValuesResourcesProvider\",\n \"$tgMembershipsResourcesProvider\",\n \"$tgNotifyPoliciesResourcesProvider\",\n \"$tgInvitationsResourcesProvider\",\n \"$tgRolesResourcesProvider\",\n \"$tgUserSettingsResourcesProvider\",\n \"$tgSprintsResourcesProvider\",\n \"$tgUserstoriesResourcesProvider\",\n \"$tgTasksResourcesProvider\",\n \"$tgIssuesResourcesProvider\",\n \"$tgWikiResourcesProvider\",\n \"$tgSearchResourcesProvider\",\n \"$tgAttachmentsResourcesProvider\",\n \"$tgMdRenderResourcesProvider\",\n \"$tgHistoryResourcesProvider\",\n \"$tgKanbanResourcesProvider\",\n \"$tgModulesResourcesProvider\",\n \"$tgWebhooksResourcesProvider\",\n \"$tgWebhookLogsResourcesProvider\",\n \"$tgLocalesResourcesProvider\",\n \"$tgUsersResourcesProvider\",\n initResources\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/search.coffee\n###\n\ntaiga = @.taiga\n\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nmixOf = @.taiga.mixOf\ndebounceLeading = @.taiga.debounceLeading\ntrim = @.taiga.trim\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaSearch\", [])\n\n\n#############################################################################\n## Search Controller\n#############################################################################\n\nclass SearchController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @q, @location, @appMetaService, @navUrls, @translate) ->\n @scope.sectionName = \"Search\"\n\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"SEARCH.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"SEARCH.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n # Search input watcher\n @scope.searchTerm = null\n loadSearchData = debounceLeading(100, (t) => @.loadSearchData(t))\n\n bindOnce @scope, \"projectId\", (projectId) =>\n if !@scope.searchResults && @scope.searchTerm\n @.loadSearchData()\n\n @scope.$watch \"searchTerm\", (term) =>\n if term != undefined && @scope.projectId\n @.loadSearchData(term)\n\n loadFilters: ->\n defered = @q.defer()\n defered.resolve()\n return defered.promise\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.issueStatusById = groupBy(project.issue_statuses, (x) -> x.id)\n @scope.taskStatusById = groupBy(project.task_statuses, (x) -> x.id)\n @scope.severityById = groupBy(project.severities, (x) -> x.id)\n @scope.priorityById = groupBy(project.priorities, (x) -> x.id)\n @scope.usStatusById = groupBy(project.us_statuses, (x) -> x.id)\n return project\n\n loadSearchData: (term = \"\") ->\n @scope.loading = true\n\n @._loadSearchData(term).then (data) =>\n if data\n @scope.searchResults = data\n @scope.loading = false\n\n _loadSearchData: (term = \"\") ->\n @.deferredAbort.resolve() if @.deferredAbort\n\n @.deferredAbort = @q.defer()\n\n @rs.search.do(@scope.projectId, term).then (data) =>\n @.deferredAbort.resolve(data)\n\n return @.deferredAbort.promise\n\n loadInitialData: ->\n return @.loadProject().then (project) =>\n @scope.projectId = project.id\n @.fillUsersAndRoles(project.members, project.roles)\n\nmodule.controller(\"SearchController\", SearchController)\n\n\n#############################################################################\n## Search box directive\n#############################################################################\n\nSearchBoxDirective = (projectService, $lightboxService, $navurls, $location, $route)->\n link = ($scope, $el, $attrs) ->\n project = null\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n text = $el.find(\"#search-text\").val()\n\n url = $navurls.resolve(\"project-search\", {project: project.get(\"slug\")})\n\n $scope.$apply ->\n $lightboxService.close($el)\n\n $location.path(url)\n $location.search(\"text\", text).path(url)\n $route.reload()\n\n\n openLightbox = () ->\n project = projectService.project\n\n $lightboxService.open($el).then () ->\n $el.find(\"#search-text\").focus()\n\n $el.on \"submit\", \"form\", submit\n\n openLightbox()\n\n return {\n templateUrl: \"search/lightbox-search.html\",\n link:link\n }\n\nSearchBoxDirective.$inject = [\n \"tgProjectService\",\n \"lightboxService\",\n \"$tgNavUrls\",\n \"$tgLocation\",\n \"$route\"\n]\n\nmodule.directive(\"tgSearchBox\", SearchBoxDirective)\n\n\n#############################################################################\n## Search Directive\n#############################################################################\n\nSearchDirective = ($log, $compile, $templatecache, $routeparams, $location) ->\n linkTable = ($scope, $el, $attrs, $ctrl) ->\n applyAutoTab = true\n activeSectionName = \"userstories\"\n tabsDom = $el.find(\"section.search-filter\")\n lastSearchResults = null\n\n getActiveSection = (data) ->\n maxVal = 0\n selectedSection = {}\n selectedSection.name = \"userstories\"\n selectedSection.value = []\n\n if !applyAutoTab\n selectedSection.name = activeSectionName\n selectedSection.value = data[activeSectionName]\n\n return selectedSection\n\n if data\n for name in [\"userstories\", \"issues\", \"tasks\", \"wikipages\"]\n value = data[name]\n\n if value.length > maxVal\n maxVal = value.length\n selectedSection.name = name\n selectedSection.value = value\n break;\n\n if maxVal == 0\n return selectedSection\n\n return selectedSection\n\n renderFilterTabs = (data) ->\n for name, value of data\n continue if name == \"count\"\n tabsDom.find(\"li.#{name} .num\").html(value.length)\n\n markSectionTabActive = (section) ->\n # Mark as active the item with max amount of results\n tabsDom.find(\"a.active\").removeClass(\"active\")\n tabsDom.find(\"li.#{section.name} a\").addClass(\"active\")\n\n applyAutoTab = false\n activeSectionName = section.name\n\n templates = {\n issues: $templatecache.get(\"search-issues\")\n tasks: $templatecache.get(\"search-tasks\")\n userstories: $templatecache.get(\"search-userstories\")\n wikipages: $templatecache.get(\"search-wikipages\")\n }\n\n renderTableContent = (section) ->\n oldElements = $el.find(\".search-result-table\").children()\n oldScope = oldElements.scope()\n\n if oldScope\n oldScope.$destroy()\n oldElements.remove()\n\n scope = $scope.$new()\n scope[section.name] = section.value\n\n template = angular.element.parseHTML(trim(templates[section.name]))\n element = $compile(template)(scope)\n $el.find(\".search-result-table\").html(element)\n\n $scope.$watch \"searchResults\", (data) ->\n lastSearchResults = data\n\n return if !lastSearchResults\n\n activeSection = getActiveSection(data)\n\n renderFilterTabs(data)\n\n renderTableContent(activeSection)\n markSectionTabActive(activeSection)\n\n $scope.$watch \"searchTerm\", (searchTerm) ->\n $location.search(\"text\", searchTerm) if searchTerm != undefined\n\n $el.on \"click\", \".search-filter li > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n sectionName = target.parent().data(\"name\")\n sectionData = if !lastSearchResults then [] else lastSearchResults[sectionName]\n\n section = {\n name: sectionName,\n value: sectionData\n }\n\n $scope.$apply ->\n renderTableContent(section)\n markSectionTabActive(section)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n linkTable($scope, $el, $attrs, $ctrl)\n\n searchText = $routeparams.text\n $scope.$watch \"projectId\", (projectId) ->\n $scope.searchTerm = searchText if projectId?\n\n return {link:link}\n\nmodule.directive(\"tgSearch\", [\"$log\", \"$compile\", \"$templateCache\", \"$routeParams\", \"$tgLocation\",\n SearchDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard.coffee\n###\n\nmodule = angular.module(\"taigaTaskboard\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/tasks.coffee\n###\n\nmodule = angular.module(\"taigaTasks\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/team.coffee\n###\n\nmodule = angular.module(\"taigaTeam\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings.coffee\n###\n\nmodule = angular.module(\"taigaUserSettings\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/userstories.coffee\n###\n\nmodule = angular.module(\"taigaUserStories\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/wiki.coffee\n###\n\nmodule = angular.module(\"taigaWiki\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/analytics.coffee\n###\n\ntaiga = @.taiga\nmodule = angular.module(\"taigaCommon\")\n\n\nclass AnalyticsService extends taiga.Service\n @.$inject = [\"$rootScope\", \"$log\", \"$tgConfig\", \"$window\", \"$document\", \"$location\"]\n\n constructor: (@rootscope, @log, @config, @win, @doc, @location) ->\n @.initialized = false\n\n conf = @config.get(\"analytics\", {})\n\n @.accountId = conf.accountId\n @.pageEvent = conf.pageEvent or \"$routeChangeSuccess\"\n @.trackRoutes = conf.trackRoutes or true\n @.ignoreFirstPageLoad = conf.ignoreFirstPageLoad or false\n\n initialize: ->\n if not @.accountId\n @log.debug \"Analytics: no acount id provided. Disabling.\"\n return\n\n @.injectAnalytics()\n\n @win.ga(\"create\", @.accountId, \"auto\")\n @win.ga(\"require\", \"displayfeatures\")\n\n if @.trackRoutes and (not @.ignoreFirstPageLoad)\n @win.ga(\"send\", \"pageview\", @.getUrl())\n\n # activates page tracking\n if @.trackRoutes\n @rootscope.$on @.pageEvent, =>\n @.trackPage(@.getUrl(), \"Taiga\")\n\n @.initialized = true\n\n getUrl: ->\n return @location.path()\n\n injectAnalytics: ->\n fn = `(function(i,s,o,g,r,a,m){i[\"GoogleAnalyticsObject\"]=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);})`\n fn(window, document, \"script\", \"//www.google-analytics.com/analytics.js\", \"ga\")\n\n trackPage: (url, title) ->\n return if not @.initialized\n return if not @win.ga\n\n title = title or @doc[0].title\n @win.ga(\"send\", \"pageview\", {\n \"page\": url,\n \"title\": title\n })\n\n trackEvent: (category, action, label, value) ->\n return if not @.initialized\n return if not @win.ga\n\n @win.ga(\"send\", \"event\", category, action, label, value)\n\n\nmodule.service(\"$tgAnalytics\", AnalyticsService)\n\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/attachments.coffee\n###\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\nbindOnce = @.taiga.bindOnce\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaCommon\")\n\n\nclass AttachmentsController extends taiga.Controller\n @.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$q\", \"$translate\"]\n\n constructor: (@scope, @rootscope, @repo, @rs, @confirm, @q, @translate) ->\n bindMethods(@)\n @.type = null\n @.objectId = null\n @.projectId = null\n\n @.uploadingAttachments = []\n @.attachments = []\n @.attachmentsCount = 0\n @.deprecatedAttachmentsCount = 0\n @.showDeprecated = false\n\n initialize: (type, objectId) ->\n @.type = type\n @.objectId = objectId\n @.projectId = @scope.projectId\n\n loadAttachments: ->\n return @.attachments if not @.objectId\n\n urlname = \"attachments/#{@.type}\"\n\n return @rs.attachments.list(urlname, @.objectId, @.projectId).then (attachments) =>\n @.attachments = _.sortBy(attachments, \"order\")\n @.updateCounters()\n return attachments\n\n updateCounters: ->\n @.attachmentsCount = @.attachments.length\n @.deprecatedAttachmentsCount = _.filter(@.attachments, {is_deprecated: true}).length\n\n _createAttachment: (attachment) ->\n urlName = \"attachments/#{@.type}\"\n\n promise = @rs.attachments.create(urlName, @.projectId, @.objectId, attachment)\n promise = promise.then (data) =>\n data.isCreatedRightNow = true\n\n index = @.uploadingAttachments.indexOf(attachment)\n @.uploadingAttachments.splice(index, 1)\n @.attachments.push(data)\n @rootscope.$broadcast(\"attachment:create\")\n\n promise = promise.then null, (data) =>\n @scope.$emit(\"attachments:size-error\") if data.status == 413\n\n index = @.uploadingAttachments.indexOf(attachment)\n @.uploadingAttachments.splice(index, 1)\n\n message = @translate.instant(\"ATTACHMENT.ERROR_UPLOAD_ATTACHMENT\", {\n fileName: attachment.name, errorMessage: data.data._error_message})\n @confirm.notify(\"error\", message)\n return @q.reject(data)\n\n return promise\n\n # Create attachments in bulk\n createAttachments: (attachments) ->\n promises = _.map(attachments, (x) => @._createAttachment(x))\n return @q.all(promises).then =>\n @.updateCounters()\n\n # Add uploading attachment tracking.\n addUploadingAttachments: (attachments) ->\n @.uploadingAttachments = _.union(@.uploadingAttachments, attachments)\n\n # Change order of attachment in a ordered list.\n # This function is mainly executed after sortable ends.\n reorderAttachment: (attachment, newIndex) ->\n oldIndex = @.attachments.indexOf(attachment)\n return if oldIndex == newIndex\n\n @.attachments.splice(oldIndex, 1)\n @.attachments.splice(newIndex, 0, attachment)\n\n _.each(@.attachments, (x,i) -> x.order = i+1)\n\n # Persist one concrete attachment.\n # This function is mainly used when user clicks\n # to save button for save one unique attachment.\n updateAttachment: (attachment) ->\n onSuccess = =>\n @.updateCounters()\n @rootscope.$broadcast(\"attachment:edit\")\n\n onError = (response) =>\n $scope.$emit(\"attachments:size-error\") if response.status == 413\n @confirm.notify(\"error\")\n return @q.reject()\n\n return @repo.save(attachment).then(onSuccess, onError)\n\n # Persist all pending modifications on attachments.\n # This function is used mainly for persist the order\n # after sorting.\n saveAttachments: ->\n return @repo.saveAll(@.attachments).then null, =>\n for item in @.attachments\n item.revert()\n @.attachments = _.sortBy(@.attachments, \"order\")\n\n # Remove one concrete attachment.\n removeAttachment: (attachment) ->\n title = @translate.instant(\"ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT\")\n message = @translate.instant(\"ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT\", {fileName: attachment.name})\n\n return @confirm.askOnDelete(title, message).then (askResponse) =>\n onSuccess = =>\n askResponse.finish()\n index = @.attachments.indexOf(attachment)\n @.attachments.splice(index, 1)\n @.updateCounters()\n @rootscope.$broadcast(\"attachment:delete\")\n\n onError = =>\n askResponse.finish(false)\n message = @translate.instant(\"ATTACHMENT.ERROR_DELETE_ATTACHMENT\", {errorMessage: message})\n @confirm.notify(\"error\", null, message)\n return @q.reject()\n\n return @repo.remove(attachment).then(onSuccess, onError)\n\n # Function used in template for filter visible attachments\n filterAttachments: (item) ->\n if @.showDeprecated\n return true\n return not item.is_deprecated\n\n\nAttachmentsDirective = ($config, $confirm, $templates, $translate) ->\n template = $templates.get(\"attachment/attachments.html\", true)\n\n link = ($scope, $el, $attrs, $ctrls) ->\n $ctrl = $ctrls[0]\n $model = $ctrls[1]\n\n bindOnce $scope, $attrs.ngModel, (value) ->\n $ctrl.initialize($attrs.type, value.id)\n $ctrl.loadAttachments()\n\n tdom = $el.find(\"div.attachment-body.sortable\")\n tdom.sortable({\n items: \"div.single-attachment\"\n handle: \"a.settings.icon.icon-drag-v\"\n containment: \".attachments\"\n dropOnEmpty: true\n scroll: false\n tolerance: \"pointer\"\n placeholder: \"sortable-placeholder single-attachment\"\n })\n\n tdom.on \"sortstop\", (event, ui) ->\n attachment = ui.item.scope().attach\n newIndex = ui.item.index()\n\n $ctrl.reorderAttachment(attachment, newIndex)\n $ctrl.saveAttachments().then ->\n $scope.$emit(\"attachment:edit\")\n\n showSizeInfo = ->\n $el.find(\".size-info\").removeClass(\"hidden\")\n\n $scope.$on \"attachments:size-error\", ->\n showSizeInfo()\n\n $el.on \"change\", \".attachments-header input\", (event) ->\n files = _.toArray(event.target.files)\n\n return if files.length < 1\n\n $scope.$apply ->\n $ctrl.addUploadingAttachments(files)\n $ctrl.createAttachments(files)\n\n $el.on \"click\", \".more-attachments\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n $scope.$apply ->\n $ctrl.showDeprecated = not $ctrl.showDeprecated\n\n target.find(\"span.text\").addClass(\"hidden\")\n if $ctrl.showDeprecated\n target.find(\"span[data-type=hide]\").removeClass(\"hidden\")\n target.find(\"more-attachments-num\").addClass(\"hidden\")\n else\n target.find(\"span[data-type=show]\").removeClass(\"hidden\")\n target.find(\"more-attachments-num\").removeClass(\"hidden\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n templateFn = ($el, $attrs) ->\n maxFileSize = $config.get(\"maxUploadFileSize\", null)\n maxFileSize = sizeFormat(maxFileSize) if maxFileSize\n maxFileSizeMsg = if maxFileSize then $translate.instant(\"ATTACHMENT.MAX_UPLOAD_SIZE\", {maxFileSize: maxFileSize}) else \"\"\n ctx = {\n type: $attrs.type\n maxFileSize: maxFileSize\n maxFileSizeMsg: maxFileSizeMsg\n }\n return template(ctx)\n\n return {\n require: [\"tgAttachments\", \"ngModel\"]\n controller: AttachmentsController\n controllerAs: \"ctrl\"\n restrict: \"AE\"\n scope: true\n link: link\n template: templateFn\n }\n\nmodule.directive(\"tgAttachments\", [\"$tgConfig\", \"$tgConfirm\", \"$tgTemplate\", \"$translate\", AttachmentsDirective])\n\n\nAttachmentDirective = ($template, $compile, $translate, $rootScope) ->\n template = $template.get(\"attachment/attachment.html\", true)\n templateEdit = $template.get(\"attachment/attachment-edit.html\", true)\n\n link = ($scope, $el, $attrs, $ctrl) ->\n render = (attachment, edit=false) ->\n permissions = $scope.project.my_permissions\n modifyPermission = permissions.indexOf(\"modify_#{$ctrl.type}\") > -1\n\n ctx = {\n id: attachment.id\n name: attachment.name\n title : $translate.instant(\"ATTACHMENT.TITLE\", {\n fileName: attachment.name,\n date: moment(attachment.created_date).format($translate.instant(\"ATTACHMENT.DATE\"))})\n url: attachment.url\n size: sizeFormat(attachment.size)\n description: attachment.description\n isDeprecated: attachment.is_deprecated\n modifyPermission: modifyPermission\n }\n\n if edit\n html = $compile(templateEdit(ctx))($scope)\n else\n html = $compile(template(ctx))($scope)\n\n $el.html(html)\n\n if attachment.is_deprecated\n $el.addClass(\"deprecated\")\n $el.find(\"input:checkbox\").prop('checked', true)\n else\n $el.removeClass(\"deprecated\")\n\n saveAttachment = ->\n attachment.description = $el.find(\"input[name='description']\").val()\n attachment.is_deprecated = $el.find(\"input[name='is-deprecated']\").prop(\"checked\")\n attachment.isCreatedRightNow = false\n\n $scope.$apply ->\n $ctrl.updateAttachment(attachment).then ->\n render(attachment, false)\n\n ## Actions (on edit mode)\n $el.on \"click\", \"a.editable-settings.icon-floppy\", (event) ->\n event.preventDefault()\n saveAttachment()\n\n $el.on \"keyup\", \"input[name=description]\", (event) ->\n if event.keyCode == 13\n saveAttachment()\n else if event.keyCode == 27\n $scope.$apply -> render(attachment, false)\n\n $el.on \"click\", \"a.editable-settings.icon-delete\", (event) ->\n event.preventDefault()\n render(attachment, false)\n\n ## Actions (on view mode)\n $el.on \"click\", \"a.settings.icon-edit\", (event) ->\n event.preventDefault()\n render(attachment, true)\n $el.find(\"input[name='description']\").focus().select()\n\n $el.on \"click\", \"a.settings.icon-delete\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $ctrl.removeAttachment(attachment)\n\n $el.on \"click\", \"div.attachment-name a\", (event) ->\n if null != attachment.name.match(/\\.(jpe?g|png|gif|gifv|webm)/i)\n event.preventDefault()\n $scope.$apply ->\n $rootScope.$broadcast(\"attachment:preview\", attachment)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n # Bootstrap\n attachment = $scope.$eval($attrs.tgAttachment)\n render(attachment, attachment.isCreatedRightNow)\n if attachment.isCreatedRightNow\n $el.find(\"input[name='description']\").focus().select()\n\n return {\n link: link\n require: \"^tgAttachments\"\n restrict: \"AE\"\n }\n\nmodule.directive(\"tgAttachment\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$rootScope\", AttachmentDirective])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: bind-scope.coffee\n###\n\nmodule = angular.module(\"taigaCommon\")\n\nBindScope = (config) ->\n if !config.debugInfo\n jQuery.fn.scope = () -> this.data('scope')\n\n link = ($scope, $el) ->\n if !config.debugInfo\n $el\n .data('scope', $scope)\n .addClass('tg-scope')\n\n return {link: link}\n\nmodule.directive(\"tgBindScope\", [\"$tgConfig\", BindScope])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: compile-html.directive.coffee\n###\n\nCompileHtmlDirective = ($compile) ->\n link = (scope, element, attrs) ->\n scope.$watch attrs.tgCompileHtml, (newValue, oldValue) ->\n element.html(newValue)\n $compile(element.contents())(scope)\n\n return {\n link: link\n }\n\nCompileHtmlDirective.$inject = [\"$compile\"]\n\nangular.module(\"taigaCommon\").directive(\"tgCompileHtml\", CompileHtmlDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/components.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaCommon\")\n\n\n#############################################################################\n## Date Range Directive (used mainly for sprint date range)\n#############################################################################\n\nDateRangeDirective = ($translate) ->\n renderRange = ($el, first, second) ->\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\")\n initDate = moment(first).format(prettyDate)\n endDate = moment(second).format(prettyDate)\n $el.html(\"#{initDate}-#{endDate}\")\n\n link = ($scope, $el, $attrs) ->\n [first, second] = $attrs.tgDateRange.split(\",\")\n\n bindOnce $scope, first, (valFirst) ->\n bindOnce $scope, second, (valSecond) ->\n renderRange($el, valFirst, valSecond)\n\n return {link:link}\n\nmodule.directive(\"tgDateRange\", [\"$translate\", DateRangeDirective])\n\n\n#############################################################################\n## Date Selector Directive (using pikaday)\n#############################################################################\n\nDateSelectorDirective = ($rootscope, datePickerConfigService) ->\n link = ($scope, $el, $attrs, $model) ->\n selectedDate = null\n\n initialize = () ->\n datePickerConfig = datePickerConfigService.get()\n\n _.merge(datePickerConfig, {\n field: $el[0]\n onSelect: (date) =>\n selectedDate = date\n onOpen: =>\n $el.picker.setDate(selectedDate) if selectedDate?\n })\n\n $el.picker = new Pikaday(datePickerConfig)\n\n unbind = $rootscope.$on \"$translateChangeEnd\", (ctx) => initialize()\n\n $scope.$watch $attrs.ngModel, (val) ->\n initialize() if val? and not $el.picker\n $el.picker.setDate(val) if val?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n unbind()\n\n return {\n link: link\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgDateSelector\", [\"$rootScope\", \"tgDatePickerConfigService\", DateSelectorDirective])\n\n\n#############################################################################\n## Sprint Progress Bar Directive\n#############################################################################\n\nSprintProgressBarDirective = ->\n renderProgress = ($el, percentage, visual_percentage) ->\n if $el.hasClass(\".current-progress\")\n $el.css(\"width\", \"#{percentage}%\")\n else\n $el.find(\".current-progress\").css(\"width\", \"#{visual_percentage}%\")\n $el.find(\".number\").html(\"#{percentage} %\")\n\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgSprintProgressbar, (sprint) ->\n closedPoints = sprint.closed_points\n totalPoints = sprint.total_points\n percentage = 0\n percentage = Math.round(100 * (closedPoints/totalPoints)) if totalPoints != 0\n visual_percentage = 0\n #Visual hack for .current-progress bar\n visual_percentage = Math.round(98 * (closedPoints/totalPoints)) if totalPoints != 0\n\n renderProgress($el, percentage, visual_percentage)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgSprintProgressbar\", SprintProgressBarDirective)\n\n\n#############################################################################\n## Created-by display directive\n#############################################################################\n\nCreatedByDisplayDirective = ($template, $compile, $translate, $navUrls)->\n # Display the owner information (full name and photo) and the date of\n # creation of an object (like USs, tasks and issues).\n #\n # Example:\n # div.us-created-by(tg-created-by-display, ng-model=\"us\")\n #\n # Requirements:\n # - model object must have the attributes 'created_date' and\n # 'owner'(ng-model)\n # - scope.usersById object is required.\n\n template = $template.get(\"common/components/created-by.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (model) ->\n owner = model.owner_extra_info or {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n photo: \"/images/user-noimage.png\"\n }\n\n html = template({\n owner: owner\n url: if owner?.is_active then $navUrls.resolve(\"user-profile\", {username: owner.username}) else \"\"\n date: moment(model.created_date).format($translate.instant(\"COMMON.DATETIME\"))\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n bindOnce $scope, $attrs.ngModel, (model) ->\n render(model) if model?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgCreatedByDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\",\n CreatedByDisplayDirective])\n\n\n#############################################################################\n## Watchers directive\n#############################################################################\n\nWatchersDirective = ($rootscope, $confirm, $repo, $qqueue, $template, $compile, $translate) ->\n # You have to include a div with the tg-lb-watchers directive in the page\n # where use this directive\n template = $template.get(\"common/components/watchers.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project?.my_permissions?.indexOf($attrs.requiredPerm) != -1\n\n save = $qqueue.bindAdd (watchers) =>\n item = $model.$modelValue.clone()\n item.watchers = watchers\n $model.$setViewValue(item)\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n watchers = _.map(watchers, (watcherId) -> $scope.usersById[watcherId])\n renderWatchers(watchers)\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n $model.$modelValue.revert()\n\n deleteWatcher = $qqueue.bindAdd (watcherIds) =>\n item = $model.$modelValue.clone()\n item.watchers = watcherIds\n $model.$setViewValue(item)\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n watchers = _.map(item.watchers, (watcherId) -> $scope.usersById[watcherId])\n renderWatchers(watchers)\n $rootscope.$broadcast(\"object:updated\")\n promise.then null, ->\n item.revert()\n $confirm.notify(\"error\")\n\n\n renderWatchers = (watchers) ->\n ctx = {\n watchers: watchers\n isEditable: isEditable()\n }\n\n html = $compile(template(ctx))($scope)\n $el.html(html)\n\n $el.on \"click\", \".js-delete-watcher\", (event) ->\n event.preventDefault()\n return if not isEditable()\n target = angular.element(event.currentTarget)\n watcherId = target.data(\"watcher-id\")\n\n title = $translate.instant(\"COMMON.WATCHERS.TITLE_LIGHTBOX_DELETE_WARTCHER\")\n message = $scope.usersById[watcherId].full_name_display\n\n $confirm.askOnDelete(title, message).then (askResponse) =>\n askResponse.finish()\n\n watcherIds = _.clone($model.$modelValue.watchers, false)\n watcherIds = _.pull(watcherIds, watcherId)\n\n deleteWatcher(watcherIds)\n\n $el.on \"click\", \".js-add-watcher\", (event) ->\n event.preventDefault()\n return if not isEditable()\n $scope.$apply ->\n $rootscope.$broadcast(\"watcher:add\", $model.$modelValue)\n\n $scope.$on \"watcher:added\", (ctx, watcherId) ->\n watchers = _.clone($model.$modelValue.watchers, false)\n watchers.push(watcherId)\n watchers = _.uniq(watchers)\n\n save(watchers)\n\n $scope.$watch $attrs.ngModel, (item) ->\n return if not item?\n watchers = _.map(item.watchers, (watcherId) -> $scope.usersById[watcherId])\n renderWatchers(watchers)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link, require:\"ngModel\"}\n\nmodule.directive(\"tgWatchers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\",\n \"$translate\", WatchersDirective])\n\n\n#############################################################################\n## Assigned to directive\n#############################################################################\n\nAssignedToDirective = ($rootscope, $confirm, $repo, $loading, $qqueue, $template, $translate, $compile) ->\n # You have to include a div with the tg-lb-assignedto directive in the page\n # where use this directive\n template = $template.get(\"common/components/assigned-to.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project?.my_permissions?.indexOf($attrs.requiredPerm) != -1\n\n save = $qqueue.bindAdd (userId) =>\n $model.$modelValue.assigned_to = userId\n\n currentLoading = $loading()\n .target($el)\n .start()\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n renderAssignedTo($model.$modelValue)\n $rootscope.$broadcast(\"object:updated\")\n promise.then null, ->\n $model.$modelValue.revert()\n $confirm.notify(\"error\")\n currentLoading.finish()\n\n return promise\n\n renderAssignedTo = (issue) ->\n assignedToId = issue?.assigned_to\n assignedTo = if assignedToId? then $scope.usersById[assignedToId] else null\n\n ctx = {\n assignedTo: assignedTo\n isEditable: isEditable()\n }\n html = $compile(template(ctx))($scope)\n $el.html(html)\n\n $el.on \"click\", \".user-assigned\", (event) ->\n event.preventDefault()\n return if not isEditable()\n $scope.$apply ->\n $rootscope.$broadcast(\"assigned-to:add\", $model.$modelValue)\n\n $el.on \"click\", \".icon-delete\", (event) ->\n event.preventDefault()\n return if not isEditable()\n title = $translate.instant(\"COMMON.ASSIGNED_TO.CONFIRM_UNASSIGNED\")\n\n $confirm.ask(title).then (response) =>\n response.finish()\n $model.$modelValue.assigned_to = null\n save(null)\n\n $scope.$on \"assigned-to:added\", (ctx, userId, item) ->\n return if item.id != $model.$modelValue.id\n\n save(userId)\n\n $scope.$watch $attrs.ngModel, (instance) ->\n renderAssignedTo(instance)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link:link,\n require:\"ngModel\"\n }\n\nmodule.directive(\"tgAssignedTo\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$translate\", \"$compile\",\n AssignedToDirective])\n\n\n#############################################################################\n## Block Button directive\n#############################################################################\n\nBlockButtonDirective = ($rootscope, $loading, $template) ->\n template = $template.get(\"common/components/block-button.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_us\") != -1\n\n $scope.$watch $attrs.ngModel, (item) ->\n return if not item\n\n if isEditable()\n $el.find('.item-block').addClass('editable')\n\n if item.is_blocked\n $el.find('.item-block').hide()\n $el.find('.item-unblock').show()\n else\n $el.find('.item-block').show()\n $el.find('.item-unblock').hide()\n\n $el.on \"click\", \".item-block\", (event) ->\n event.preventDefault()\n $rootscope.$broadcast(\"block\", $model.$modelValue)\n\n $el.on \"click\", \".item-unblock\", (event) ->\n event.preventDefault()\n currentLoading = $loading()\n .target($el.find(\".item-unblock\"))\n .start()\n\n finish = ->\n currentLoading.finish()\n\n $rootscope.$broadcast(\"unblock\", $model.$modelValue, finish)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n template: template\n }\n\nmodule.directive(\"tgBlockButton\", [\"$rootScope\", \"$tgLoading\", \"$tgTemplate\", BlockButtonDirective])\n\n\n#############################################################################\n## Delete Button directive\n#############################################################################\n\nDeleteButtonDirective = ($log, $repo, $confirm, $location, $template) ->\n template = $template.get(\"common/components/delete-button.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n if not $attrs.onDeleteGoToUrl\n return $log.error \"DeleteButtonDirective requires on-delete-go-to-url set in scope.\"\n if not $attrs.onDeleteTitle\n return $log.error \"DeleteButtonDirective requires on-delete-title set in scope.\"\n\n $el.on \"click\", \".button-delete\", (event) ->\n title = $attrs.onDeleteTitle\n subtitle = $model.$modelValue.subject\n\n $confirm.askOnDelete(title, subtitle).then (askResponse) =>\n promise = $repo.remove($model.$modelValue)\n promise.then =>\n askResponse.finish()\n url = $scope.$eval($attrs.onDeleteGoToUrl)\n $location.path(url)\n promise.then null, =>\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n template: template\n }\n\nmodule.directive(\"tgDeleteButton\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgTemplate\", DeleteButtonDirective])\n\n\n#############################################################################\n## Editable subject directive\n#############################################################################\n\nEditableSubjectDirective = ($rootscope, $repo, $confirm, $loading, $qqueue, $template) ->\n template = $template.get(\"common/components/editable-subject.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n\n $scope.$on \"object:updated\", () ->\n $el.find('.edit-subject').hide()\n $el.find('.view-subject').show()\n\n isEditable = ->\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) != -1\n\n save = $qqueue.bindAdd (subject) =>\n $model.$modelValue.subject = subject\n\n currentLoading = $loading()\n .target($el.find('.save-container'))\n .start()\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n $el.find('.edit-subject').hide()\n $el.find('.view-subject').show()\n promise.then null, ->\n $confirm.notify(\"error\")\n promise.finally ->\n currentLoading.finish()\n\n return promise\n\n $el.click ->\n return if not isEditable()\n $el.find('.edit-subject').show()\n $el.find('.view-subject').hide()\n $el.find('input').focus()\n\n $el.on \"click\", \".save\", (e) ->\n e.preventDefault()\n\n subject = $scope.item.subject\n save(subject)\n\n $el.on \"keyup\", \"input\", (event) ->\n if event.keyCode == 13\n subject = $scope.item.subject\n save(subject)\n else if event.keyCode == 27\n $scope.$apply () => $model.$modelValue.revert()\n\n $el.find('div.edit-subject').hide()\n $el.find('div.view-subject').show()\n\n $el.find('div.edit-subject').hide()\n $el.find('div.view-subject span.edit').hide()\n\n $scope.$watch $attrs.ngModel, (value) ->\n return if not value\n $scope.item = value\n\n if not isEditable()\n $el.find('.view-subject .edit').remove()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n template: template\n }\n\nmodule.directive(\"tgEditableSubject\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\",\n \"$tgTemplate\", EditableSubjectDirective])\n\n\n#############################################################################\n## Editable description directive\n#############################################################################\n\nEditableDescriptionDirective = ($rootscope, $repo, $confirm, $compile, $loading, $selectedText, $qqueue, $template) ->\n template = $template.get(\"common/components/editable-description.html\")\n noDescriptionMegEditMode = $template.get(\"common/components/editable-description-msg-edit-mode.html\")\n noDescriptionMegReadMode = $template.get(\"common/components/editable-description-msg-read-mode.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n $el.find('.edit-description').hide()\n $el.find('.view-description .edit').hide()\n\n $scope.$on \"object:updated\", () ->\n $el.find('.edit-description').hide()\n $el.find('.view-description').show()\n\n isEditable = ->\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) != -1\n\n save = $qqueue.bindAdd (description) =>\n $model.$modelValue.description = description\n\n currentLoading = $loading()\n .target($el.find('.save-container'))\n .start()\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n $el.find('.edit-description').hide()\n $el.find('.view-description').show()\n promise.then null, ->\n $confirm.notify(\"error\")\n promise.finally ->\n currentLoading.finish()\n\n $el.on \"mouseup\", \".view-description\", (event) ->\n # We want to dettect the a inside the div so we use the target and\n # not the currentTarget\n target = angular.element(event.target)\n return if not isEditable()\n return if target.is('a')\n return if $selectedText.get().length\n\n $el.find('.edit-description').show()\n $el.find('.view-description').hide()\n $el.find('textarea').focus()\n\n $el.on \"click\", \"a\", (event) ->\n target = angular.element(event.target)\n href = target.attr('href')\n if href.indexOf(\"#\") == 0\n event.preventDefault()\n $('body').scrollTop($(href).offset().top)\n\n $el.on \"click\", \".save\", (e) ->\n e.preventDefault()\n\n description = $scope.item.description\n save(description)\n\n $el.on \"keydown\", \"textarea\", (event) ->\n if event.keyCode == 27\n $scope.$apply () => $scope.item.revert()\n $el.find('.edit-description').hide()\n $el.find('.view-description').show()\n\n $scope.$watch $attrs.ngModel, (value) ->\n return if not value\n $scope.item = value\n\n if isEditable()\n $el.find('.view-description .edit').show()\n $el.find('.view-description .us-content').addClass('editable')\n $scope.noDescriptionMsg = $compile(noDescriptionMegEditMode)($scope)\n else\n $scope.noDescriptionMsg = $compile(noDescriptionMegReadMode)($scope)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n template: template\n }\n\nmodule.directive(\"tgEditableDescription\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\", \"$tgLoading\",\n \"$selectedText\", \"$tgQqueue\", \"$tgTemplate\", EditableDescriptionDirective])\n\n\n#############################################################################\n## Common list directives\n#############################################################################\n## NOTE: These directives are used in issues and search and are\n## completely bindonce, they only serves for visualization of data.\n#############################################################################\n\nListItemUsStatusDirective = ->\n link = ($scope, $el, $attrs) ->\n us = $scope.$eval($attrs.tgListitemUsStatus)\n bindOnce $scope, \"usStatusById\", (usStatusById) ->\n $el.html(usStatusById[us.status].name)\n\n return {link:link}\n\nmodule.directive(\"tgListitemUsStatus\", ListItemUsStatusDirective)\n\n\nListItemTaskStatusDirective = ->\n link = ($scope, $el, $attrs) ->\n task = $scope.$eval($attrs.tgListitemTaskStatus)\n bindOnce $scope, \"taskStatusById\", (taskStatusById) ->\n $el.html(taskStatusById[task.status].name)\n\n return {link:link}\n\nmodule.directive(\"tgListitemTaskStatus\", ListItemTaskStatusDirective)\n\n\nListItemAssignedtoDirective = ($template) ->\n template = $template.get(\"common/components/list-item-assigned-to-avatar.html\", true)\n\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"usersById\", (usersById) ->\n item = $scope.$eval($attrs.tgListitemAssignedto)\n ctx = {name: \"Unassigned\", imgurl: \"/images/unnamed.png\"}\n\n member = usersById[item.assigned_to]\n if member\n ctx.imgurl = member.photo\n ctx.name = member.full_name_display\n\n $el.html(template(ctx))\n\n return {link:link}\n\nmodule.directive(\"tgListitemAssignedto\", [\"$tgTemplate\", ListItemAssignedtoDirective])\n\n\nListItemIssueStatusDirective = ->\n link = ($scope, $el, $attrs) ->\n issue = $scope.$eval($attrs.tgListitemIssueStatus)\n bindOnce $scope, \"issueStatusById\", (issueStatusById) ->\n $el.html(issueStatusById[issue.status].name)\n\n return {link:link}\n\nmodule.directive(\"tgListitemIssueStatus\", ListItemIssueStatusDirective)\n\n\nListItemTypeDirective = ->\n link = ($scope, $el, $attrs) ->\n render = (issueTypeById, issue) ->\n type = issueTypeById[issue.type]\n domNode = $el.find(\".level\")\n domNode.css(\"background-color\", type.color)\n domNode.attr(\"title\", type.name)\n\n bindOnce $scope, \"issueTypeById\", (issueTypeById) ->\n issue = $scope.$eval($attrs.tgListitemType)\n render(issueTypeById, issue)\n\n $scope.$watch $attrs.tgListitemType, (issue) ->\n render($scope.issueTypeById, issue)\n\n return {\n link: link\n templateUrl: \"common/components/level.html\"\n }\n\nmodule.directive(\"tgListitemType\", ListItemTypeDirective)\n\n\nListItemPriorityDirective = ->\n link = ($scope, $el, $attrs) ->\n render = (priorityById, issue) ->\n priority = priorityById[issue.priority]\n domNode = $el.find(\".level\")\n domNode.css(\"background-color\", priority.color)\n domNode.attr(\"title\", priority.name)\n\n bindOnce $scope, \"priorityById\", (priorityById) ->\n issue = $scope.$eval($attrs.tgListitemPriority)\n render(priorityById, issue)\n\n $scope.$watch $attrs.tgListitemPriority, (issue) ->\n render($scope.priorityById, issue)\n\n return {\n link: link\n templateUrl: \"common/components/level.html\"\n }\n\nmodule.directive(\"tgListitemPriority\", ListItemPriorityDirective)\n\n\nListItemSeverityDirective = ->\n link = ($scope, $el, $attrs) ->\n render = (severityById, issue) ->\n severity = severityById[issue.severity]\n domNode = $el.find(\".level\")\n domNode.css(\"background-color\", severity.color)\n domNode.attr(\"title\", severity.name)\n\n bindOnce $scope, \"severityById\", (severityById) ->\n issue = $scope.$eval($attrs.tgListitemSeverity)\n render(severityById, issue)\n\n $scope.$watch $attrs.tgListitemSeverity, (issue) ->\n render($scope.severityById, issue)\n\n return {\n link: link\n templateUrl: \"common/components/level.html\"\n }\n\nmodule.directive(\"tgListitemSeverity\", ListItemSeverityDirective)\n\n\n#############################################################################\n## Progress bar directive\n#############################################################################\n\nTgProgressBarDirective = ($template) ->\n template = $template.get(\"common/components/progress-bar.html\", true)\n\n render = (el, percentage) ->\n el.html(template({percentage: percentage}))\n\n link = ($scope, $el, $attrs) ->\n element = angular.element($el)\n\n $scope.$watch $attrs.tgProgressBar, (percentage) ->\n percentage = _.max([0 , percentage])\n percentage = _.min([100, percentage])\n render($el, percentage)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgProgressBar\", [\"$tgTemplate\", TgProgressBarDirective])\n\n\n#############################################################################\n## Main title directive\n#############################################################################\n\nTgMainTitleDirective = ($translate) ->\n link = ($scope, $el, $attrs) ->\n $attrs.$observe \"i18nSectionName\", (i18nSectionName) ->\n $scope.sectionName = $translate.instant(i18nSectionName)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n templateUrl: \"common/components/main-title.html\"\n scope: {\n projectName : \"=projectName\"\n }\n }\n\nmodule.directive(\"tgMainTitle\", [\"$translate\", TgMainTitleDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/confirm.coffee\n###\n\ntaiga = @.taiga\ntimeout = @.taiga.timeout\ncancelTimeout = @.taiga.cancelTimeout\ndebounce = @.taiga.debounce\nbindMethods = @.taiga.bindMethods\n\nNOTIFICATION_MSG = {\n \"success\":\n title: \"NOTIFICATION.OK\"\n message: \"NOTIFICATION.SAVED\"\n \"error\":\n title: \"NOTIFICATION.WARNING\"\n message: \"NOTIFICATION.WARNING_TEXT\"\n \"light-error\":\n title: \"NOTIFICATION.WARNING\"\n message: \"NOTIFICATION.WARNING_TEXT\"\n}\n\n\nclass ConfirmService extends taiga.Service\n @.$inject = [\"$q\", \"lightboxService\", \"$tgLoading\", \"$translate\"]\n\n constructor: (@q, @lightboxService, @loading, @translate) ->\n bindMethods(@)\n\n hide: (el)->\n if el\n @lightboxService.close(el)\n\n el.off(\".confirm-dialog\")\n\n ask: (title, subtitle, message, lightboxSelector=\".lightbox-generic-ask\") ->\n defered = @q.defer()\n\n el = angular.element(lightboxSelector)\n\n # Render content\n el.find(\"h2.title\").html(title)\n el.find(\"span.subtitle\").html(subtitle)\n el.find(\"span.message\").html(message)\n\n # Assign event handlers\n el.on \"click.confirm-dialog\", \"a.button-green\", debounce 2000, (event) =>\n event.preventDefault()\n target = angular.element(event.currentTarget)\n currentLoading = @loading()\n .target(target)\n .start()\n defered.resolve {\n finish: (ok=true) =>\n currentLoading.finish()\n if ok\n @.hide(el)\n }\n\n el.on \"click.confirm-dialog\", \"a.button-red\", (event) =>\n event.preventDefault()\n defered.reject()\n @.hide(el)\n\n @lightboxService.open(el)\n\n return defered.promise\n\n askOnDelete: (title, message) ->\n return @.ask(title, @translate.instant(\"NOTIFICATION.ASK_DELETE\"), message)\n\n askChoice: (title, subtitle, choices, replacement, warning, lightboxSelector=\".lightbox-ask-choice\") ->\n defered = @q.defer()\n\n el = angular.element(lightboxSelector)\n\n # Render content\n el.find(\".title\").html(title)\n el.find(\".subtitle\").html(subtitle)\n\n if replacement\n el.find(\".replacement\").html(replacement)\n else\n el.find(\".replacement\").remove()\n\n if warning\n el.find(\".warning\").html(warning)\n else\n el.find(\".warning\").remove()\n\n choicesField = el.find(\".choices\")\n choicesField.html('')\n _.each choices, (value, key) ->\n choicesField.append(angular.element(\"\"))\n\n # Assign event handlers\n el.on \"click.confirm-dialog\", \"a.button-green\", debounce 2000, (event) =>\n event.preventDefault()\n target = angular.element(event.currentTarget)\n currentLoading = @loading()\n .target(target)\n .start()\n defered.resolve {\n selected: choicesField.val()\n finish: (ok=true) =>\n currentLoading.finish()\n if ok\n @.hide(el)\n }\n\n el.on \"click.confirm-dialog\", \"a.button-red\", (event) =>\n event.preventDefault()\n defered.reject()\n @.hide(el)\n\n @lightboxService.open(el)\n\n return defered.promise\n\n error: (message) ->\n defered = @q.defer()\n\n el = angular.element(\".lightbox-generic-error\")\n\n # Render content\n el.find(\"h2.title\").html(message)\n\n # Assign event handlers\n el.on \"click.confirm-dialog\", \"a.button-green\", (event) =>\n event.preventDefault()\n defered.resolve()\n @.hide(el)\n\n el.on \"click.confirm-dialog\", \"a.close\", (event) =>\n event.preventDefault()\n defered.resolve()\n @.hide(el)\n\n @lightboxService.open(el)\n\n return defered.promise\n\n success: (title, message) ->\n defered = @q.defer()\n\n el = angular.element(\".lightbox-generic-success\")\n\n # Render content\n el.find(\"h2.title\").html(title) if title\n el.find(\"p.message\").html(message) if message\n\n # Assign event handlers\n el.on \"click.confirm-dialog\", \"a.button-green\", (event) =>\n event.preventDefault()\n defered.resolve()\n @.hide(el)\n\n el.on \"click.confirm-dialog\", \"a.close\", (event) =>\n event.preventDefault()\n defered.resolve()\n @.hide(el)\n\n @lightboxService.open(el)\n\n return defered.promise\n\n loader: (title, message) ->\n el = angular.element(\".lightbox-generic-loading\")\n\n # Render content\n el.find(\"h2.title\").html(title) if title\n el.find(\"p.message\").html(message) if message\n\n return {\n start: => @lightboxService.open(el)\n stop: => @lightboxService.close(el)\n update: (status, title, message, percent) =>\n el.find(\"h2.title\").html(title) if title\n el.find(\"p.message\").html(message) if message\n\n if percent\n el.find(\".spin\").addClass(\"hidden\")\n el.find(\".progress-bar-wrapper\").removeClass(\"hidden\")\n el.find(\".progress-bar-wrapper > .bar\").width(percent + '%')\n el.find(\".progress-bar-wrapper > span\").html(percent + '%').css('left', (percent - 9) + '%' )\n else\n el.find(\".spin\").removeClass(\"hidden\")\n el.find(\".progress-bar-wrapper\").addClass(\"hidden\")\n }\n\n notify: (type, message, title, time) ->\n # NOTE: Typesi are: error, success, light-error\n # See partials/components/notification-message.jade)\n # Add default texts to NOTIFICATION_MSG for new notification types\n\n selector = \".notification-message-#{type}\"\n el = angular.element(selector)\n\n return if el.hasClass(\"active\")\n\n if title\n el.find(\"h4\").html(title)\n else\n el.find(\"h4\").html(@translate.instant(NOTIFICATION_MSG[type].title))\n\n if message\n el.find(\"p\").html(message)\n else\n el.find(\"p\").html(@translate.instant(NOTIFICATION_MSG[type].message))\n\n body = angular.element(\"body\")\n body.find(\".notification-message .notification-light\")\n .removeClass('active')\n .addClass('inactive')\n\n body.find(selector)\n .removeClass('inactive')\n .addClass('active')\n\n if @.tsem\n cancelTimeout(@.tsem)\n\n if !time\n time = if type == 'error' or type == 'light-error' then 3500 else 1500\n\n @.tsem = timeout time, =>\n body.find(selector)\n .removeClass('active')\n .addClass('inactive')\n\n delete @.tsem\n\n el.on \"click\", \".icon-delete, .close\", (event) =>\n body.find(selector)\n .removeClass('active')\n .addClass('inactive')\n\n\nmodule = angular.module(\"taigaCommon\")\nmodule.service(\"$tgConfirm\", ConfirmService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/custom-field-values.coffee\n###\n\ntaiga = @.taiga\nbindMethods = @.taiga.bindMethods\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\ngenerateHash = taiga.generateHash\n\nmodule = angular.module(\"taigaCommon\")\n\n# Custom attributes types (see taiga-back/taiga/projects/custom_attributes/choices.py)\nTEXT_TYPE = \"text\"\nMULTILINE_TYPE = \"multiline\"\nDATE_TYPE = \"date\"\n\n\nTYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n },\n {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n },\n {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }\n]\n\n\n\nclass CustomAttributesValuesController extends taiga.Controller\n @.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$q\"]\n\n constructor: (@scope, @rootscope, @repo, @rs, @confirm, @q) ->\n bindMethods(@)\n @.type = null\n @.objectId = null\n @.projectId = null\n @.customAttributes = []\n @.customAttributesValues = null\n\n initialize: (type, objectId) ->\n @.project = @scope.project\n @.type = type\n @.objectId = objectId\n @.projectId = @scope.projectId\n\n loadCustomAttributesValues: ->\n return @.customAttributesValues if not @.objectId\n return @rs.customAttributesValues[@.type].get(@.objectId).then (customAttributesValues) =>\n @.customAttributes = @.project[\"#{@.type}_custom_attributes\"]\n @.customAttributesValues = customAttributesValues\n return customAttributesValues\n\n getAttributeValue: (attribute) ->\n attributeValue = _.clone(attribute, false)\n attributeValue.value = @.customAttributesValues.attributes_values[attribute.id]\n return attributeValue\n\n updateAttributeValue: (attributeValue) ->\n onSuccess = =>\n @rootscope.$broadcast(\"custom-attributes-values:edit\")\n\n onError = (response) =>\n @confirm.notify(\"error\")\n return @q.reject()\n\n # We need to update the full array so angular understand the model is modified\n attributesValues = _.clone(@.customAttributesValues.attributes_values, true)\n attributesValues[attributeValue.id] = attributeValue.value\n @.customAttributesValues.attributes_values = attributesValues\n @.customAttributesValues.id = @.objectId\n return @repo.save(@.customAttributesValues).then(onSuccess, onError)\n\n\nCustomAttributesValuesDirective = ($templates, $storage) ->\n template = $templates.get(\"custom-attributes/custom-attributes-values.html\", true)\n collapsedHash = (type) ->\n return generateHash([\"custom-attributes-collapsed\", type])\n\n link = ($scope, $el, $attrs, $ctrls) ->\n $ctrl = $ctrls[0]\n $model = $ctrls[1]\n\n bindOnce $scope, $attrs.ngModel, (value) ->\n $ctrl.initialize($attrs.type, value.id)\n $ctrl.loadCustomAttributesValues()\n\n $el.on \"click\", \".custom-fields-header a\", ->\n hash = collapsedHash($attrs.type)\n collapsed = not($storage.get(hash) or false)\n $storage.set(hash, collapsed)\n if collapsed\n $el.find(\".custom-fields-header a\").removeClass(\"open\")\n $el.find(\".custom-fields-body\").removeClass(\"open\")\n else\n $el.find(\".custom-fields-header a\").addClass(\"open\")\n $el.find(\".custom-fields-body\").addClass(\"open\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n templateFn = ($el, $attrs) ->\n collapsed = $storage.get(collapsedHash($attrs.type)) or false\n\n return template({\n requiredEditionPerm: $attrs.requiredEditionPerm\n collapsed: collapsed\n })\n\n return {\n require: [\"tgCustomAttributesValues\", \"ngModel\"]\n controller: CustomAttributesValuesController\n controllerAs: \"ctrl\"\n restrict: \"AE\"\n scope: true\n link: link\n template: templateFn\n }\n\nmodule.directive(\"tgCustomAttributesValues\", [\"$tgTemplate\", \"$tgStorage\", \"$translate\",\n CustomAttributesValuesDirective])\n\n\nCustomAttributeValueDirective = ($template, $selectedText, $compile, $translate, datePickerConfigService) ->\n template = $template.get(\"custom-attributes/custom-attribute-value.html\", true)\n templateEdit = $template.get(\"custom-attributes/custom-attribute-value-edit.html\", true)\n\n link = ($scope, $el, $attrs, $ctrl) ->\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n\n render = (attributeValue, edit=false) ->\n if attributeValue.type is DATE_TYPE and attributeValue.value\n value = moment(attributeValue.value, \"YYYY-MM-DD\").format(prettyDate)\n else\n value = attributeValue.value\n editable = isEditable()\n\n ctx = {\n id: attributeValue.id\n name: attributeValue.name\n description: attributeValue.description\n value: value\n isEditable: editable\n type: attributeValue.type\n }\n\n if editable and (edit or not value)\n html = templateEdit(ctx)\n html = $compile(html)($scope)\n $el.html(html)\n\n if attributeValue.type == DATE_TYPE\n datePickerConfig = datePickerConfigService.get()\n _.merge(datePickerConfig, {\n field: $el.find(\"input[name=value]\")[0]\n onSelect: (date) =>\n selectedDate = date\n onOpen: =>\n $el.picker.setDate(selectedDate) if selectedDate?\n })\n $el.picker = new Pikaday(datePickerConfig)\n else\n html = template(ctx)\n html = $compile(html)($scope)\n $el.html(html)\n\n isEditable = ->\n permissions = $scope.project.my_permissions\n requiredEditionPerm = $attrs.requiredEditionPerm\n return permissions.indexOf(requiredEditionPerm) > -1\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n attributeValue.value = $el.find(\"input[name=value], textarea[name='value']\").val()\n if attributeValue.type is DATE_TYPE\n if moment(attributeValue.value, prettyDate).isValid()\n attributeValue.value = moment(attributeValue.value, prettyDate).format(\"YYYY-MM-DD\")\n else\n attributeValue.value = \"\"\n\n $scope.$apply ->\n $ctrl.updateAttributeValue(attributeValue).then ->\n render(attributeValue, false)\n\n setFocusAndSelectOnInputField = ->\n $el.find(\"input[name='value'], textarea[name='value']\").focus().select()\n\n # Bootstrap\n attributeValue = $scope.$eval($attrs.tgCustomAttributeValue)\n render(attributeValue)\n\n ## Actions (on view mode)\n $el.on \"click\", \".js-value-view-mode\", ->\n return if not isEditable()\n return if $selectedText.get().length\n render(attributeValue, true)\n setFocusAndSelectOnInputField()\n\n $el.on \"click\", \"a.icon-edit\", (event) ->\n event.preventDefault()\n render(attributeValue, true)\n setFocusAndSelectOnInputField()\n\n ## Actions (on edit mode)\n $el.on \"keyup\", \"input[name=value], textarea[name='value']\", (event) ->\n if event.keyCode is 13 and event.currentTarget.type isnt \"textarea\"\n submit(event)\n else if event.keyCode == 27\n render(attributeValue, false)\n\n $el.on \"submit\", \"form\", submit\n\n $el.on \"click\", \"a.icon-floppy\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n require: \"^tgCustomAttributesValues\"\n restrict: \"AE\"\n }\n\nmodule.directive(\"tgCustomAttributeValue\", [\"$tgTemplate\", \"$selectedText\", \"$compile\", \"$translate\",\n \"tgDatePickerConfigService\", CustomAttributeValueDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/estimation.coffee\n###\n\ntaiga = @.taiga\ngroupBy = @.taiga.groupBy\n\nmodule = angular.module(\"taigaCommon\")\n\n#############################################################################\n## User story estimation directive (for Lightboxes)\n#############################################################################\n\nLbUsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $template, $compile) ->\n # Display the points of a US and you can edit it.\n #\n # Example:\n # tg-lb-us-estimation-progress-bar(ng-model=\"us\")\n #\n # Requirements:\n # - Us object (ng-model)\n # - scope.project object\n\n link = ($scope, $el, $attrs, $model) ->\n $scope.$watch $attrs.ngModel, (us) ->\n if us\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project)\n estimationProcess.onSelectedPointForRole = (roleId, pointId) ->\n $scope.$apply ->\n $model.$setViewValue(us)\n\n\n estimationProcess.render = () ->\n ctx = {\n totalPoints: @calculateTotalPoints()\n roles: @calculateRoles()\n editable: @isEditable\n }\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\"\n template = $template.get(mainTemplate, true)\n html = template(ctx)\n html = $compile(html)($scope)\n @$el.html(html)\n\n estimationProcess.render()\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgLbUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgTemplate\", \"$compile\", LbUsEstimationDirective])\n\n\n#############################################################################\n## User story estimation directive\n#############################################################################\n\nUsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $qqueue, $template, $compile) ->\n # Display the points of a US and you can edit it.\n #\n # Example:\n # tg-us-estimation-progress-bar(ng-model=\"us\")\n #\n # Requirements:\n # - Us object (ng-model)\n # - scope.project object\n\n link = ($scope, $el, $attrs, $model) ->\n $scope.$watch $attrs.ngModel, (us) ->\n if us\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project)\n estimationProcess.onSelectedPointForRole = (roleId, pointId) ->\n @save(roleId, pointId).then ->\n $rootScope.$broadcast(\"object:updated\")\n\n estimationProcess.render = () ->\n ctx = {\n totalPoints: @calculateTotalPoints()\n roles: @calculateRoles()\n editable: @isEditable\n }\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\"\n template = $template.get(mainTemplate, true)\n html = template(ctx)\n html = $compile(html)($scope)\n @$el.html(html)\n\n estimationProcess.render()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\"\n UsEstimationDirective])\n\n\n#############################################################################\n## Estimations service\n#############################################################################\n\nEstimationsService = ($template, $qqueue, $repo, $confirm, $q) ->\n pointsTemplate = $template.get(\"common/estimation/us-estimation-points.html\", true)\n\n class EstimationProcess\n constructor: (@$el, @us, @project) ->\n @isEditable = @project.my_permissions.indexOf(\"modify_us\") != -1\n @roles = @project.roles\n @points = @project.points\n @pointsById = groupBy(@points, (x) -> x.id)\n @onSelectedPointForRole = (roleId, pointId) ->\n @render = () ->\n\n save: (roleId, pointId) ->\n deferred = $q.defer()\n $qqueue.add () =>\n onSuccess = =>\n deferred.resolve()\n $confirm.notify(\"success\")\n\n onError = =>\n $confirm.notify(\"error\")\n @us.revert()\n @render()\n deferred.reject()\n\n $repo.save(@us).then(onSuccess, onError)\n\n return deferred.promise\n\n calculateTotalPoints: () ->\n values = _.map(@us.points, (v, k) => @pointsById[v]?.value)\n\n if values.length == 0\n return \"0\"\n\n notNullValues = _.filter(values, (v) -> v?)\n if notNullValues.length == 0\n return \"?\"\n\n return _.reduce(notNullValues, (acc, num) -> acc + num)\n\n calculateRoles: () ->\n computableRoles = _.filter(@project.roles, \"computable\")\n roles = _.map computableRoles, (role) =>\n pointId = @us.points[role.id]\n pointObj = @pointsById[pointId]\n role = _.clone(role, true)\n role.points = if pointObj? and pointObj.name? then pointObj.name else \"?\"\n return role\n\n return roles\n\n bindClickEvents: =>\n @$el.on \"click\", \".total.clickable\", (event) =>\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n roleId = target.data(\"role-id\")\n @renderPointsSelector(roleId, target)\n target.siblings().removeClass('active')\n target.addClass('active')\n\n @$el.on \"click\", \".point\", (event) =>\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n roleId = target.data(\"role-id\")\n pointId = target.data(\"point-id\")\n @$el.find(\".popover\").popover().close()\n points = _.clone(@us.points, true)\n points[roleId] = pointId\n @us.points = points\n @render()\n @onSelectedPointForRole(roleId, pointId)\n\n renderPointsSelector: (roleId, target) ->\n points = _.map @points, (point) =>\n point = _.clone(point, true)\n point.selected = if @us.points[roleId] == point.id then false else true\n return point\n\n maxPointLength = 5\n horizontalList = _.some points, (point) => point.name.length > maxPointLength\n\n html = pointsTemplate({\"points\": points, roleId: roleId, horizontal: horizontalList})\n # Remove any previous state\n @$el.find(\".popover\").popover().close()\n @$el.find(\".pop-points-open\").remove()\n # Render into DOM and show the new created element\n if target?\n @$el.find(target).append(html)\n else\n @$el.append(html)\n\n @$el.find(\".pop-points-open\").popover().open ->\n $(this)\n .removeClass(\"active\")\n .closest(\"li\").removeClass(\"active\")\n\n @$el.find(\".pop-points-open\").show()\n\n pop = @$el.find(\".pop-points-open\")\n if pop.offset().top + pop.height() > document.body.clientHeight\n pop.addClass('pop-bottom')\n\n create = ($el, us, project) ->\n $el.unbind(\"click\")\n\n estimationProcess = new EstimationProcess($el, us, project)\n\n if estimationProcess.isEditable\n estimationProcess.bindClickEvents()\n\n return estimationProcess\n\n return {\n create: create\n }\n\nmodule.factory(\"$tgEstimationsService\", [\"$tgTemplate\", \"$tgQqueue\", \"$tgRepo\", \"$tgConfirm\", \"$q\", EstimationsService])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/filters.coffee\n###\n\ntaiga = @.taiga\n\nmodule = angular.module(\"taigaCommon\")\n\n\ndefaultFilter = ->\n return (value, defaultValue) ->\n if value is [null, undefined]\n return defaultValue\n return value\n\nmodule.filter(\"default\", defaultFilter)\n\n\nyesNoFilter = ($translate) ->\n return (value) ->\n if value\n return $translate.instant(\"COMMON.YES\")\n\n return $translate.instant(\"COMMON.NO\")\n\nmodule.filter(\"yesNo\", [\"$translate\", yesNoFilter])\n\n\nunslugify = ->\n return taiga.unslugify\n\nmodule.filter(\"unslugify\", unslugify)\n\n\nmomentFormat = ->\n return (input, format) ->\n if input\n return moment(input).format(format)\n return \"\"\n\nmodule.filter(\"momentFormat\", momentFormat)\n\n\nmomentFromNow = ->\n return (input, without_suffix) ->\n if input\n return moment(input).fromNow(without_suffix or false)\n return \"\"\n\nmodule.filter(\"momentFromNow\", momentFromNow)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/history.coffee\n###\n\ntaiga = @.taiga\ntrim = @.taiga.trim\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaCommon\")\n\nIGNORED_FIELDS = {\n \"userstories.userstory\": [\n \"watchers\", \"kanban_order\", \"backlog_order\", \"sprint_order\", \"finish_date\"\n ]\n \"tasks.task\": [\n \"watchers\", \"us_order\", \"taskboard_order\"\n ]\n}\n\n#############################################################################\n## History Directive (Main)\n#############################################################################\n\n\nclass HistoryController extends taiga.Controller\n @.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\"]\n\n constructor: (@scope, @repo, @rs) ->\n\n initialize: (type, objectId) ->\n @.type = type\n @.objectId = objectId\n\n loadHistory: (type, objectId) ->\n return @rs.history.get(type, objectId).then (history) =>\n for historyResult in history\n # If description was modified take only the description_html field\n if historyResult.values_diff.description_diff?\n historyResult.values_diff.description = historyResult.values_diff.description_diff\n\n delete historyResult.values_diff.description_html\n delete historyResult.values_diff.description_diff\n\n # If block note was modified take only the blocked_note_html field\n if historyResult.values_diff.blocked_note_diff?\n historyResult.values_diff.blocked_note = historyResult.values_diff.blocked_note_diff\n\n delete historyResult.values_diff.blocked_note_html\n delete historyResult.values_diff.blocked_note_diff\n\n @scope.history = history\n @scope.comments = _.filter(history, (item) -> item.comment != \"\")\n\n deleteComment: (type, objectId, activityId) ->\n return @rs.history.deleteComment(type, objectId, activityId).then => @.loadHistory(type, objectId)\n\n undeleteComment: (type, objectId, activityId) ->\n return @rs.history.undeleteComment(type, objectId, activityId).then => @.loadHistory(type, objectId)\n\n\nHistoryDirective = ($log, $loading, $qqueue, $template, $confirm, $translate, $compile, $navUrls, $rootScope) ->\n templateChangeDiff = $template.get(\"common/history/history-change-diff.html\", true)\n templateChangePoints = $template.get(\"common/history/history-change-points.html\", true)\n templateChangeGeneric = $template.get(\"common/history/history-change-generic.html\", true)\n templateChangeAttachment = $template.get(\"common/history/history-change-attachment.html\", true)\n templateChangeList = $template.get(\"common/history/history-change-list.html\", true)\n templateDeletedComment = $template.get(\"common/history/history-deleted-comment.html\", true)\n templateActivity = $template.get(\"common/history/history-activity.html\", true)\n templateBaseEntries = $template.get(\"common/history/history-base-entries.html\", true)\n templateBase = $template.get(\"common/history/history-base.html\", true)\n\n link = ($scope, $el, $attrs, $ctrl) ->\n # Bootstraping\n type = $attrs.type\n objectId = null\n\n showAllComments = false\n showAllActivity = false\n\n getPrettyDateFormat = ->\n return $translate.instant(\"ACTIVITY.DATETIME\")\n\n bindOnce $scope, $attrs.ngModel, (model) ->\n type = $attrs.type\n objectId = model.id\n\n $ctrl.initialize(type, objectId)\n $ctrl.loadHistory(type, objectId)\n\n # Helpers\n getHumanizedFieldName = (field) ->\n humanizedFieldNames = {\n subject : $translate.instant(\"ACTIVITY.FIELDS.SUBJECT\")\n name: $translate.instant(\"ACTIVITY.FIELDS.NAME\")\n description : $translate.instant(\"ACTIVITY.FIELDS.DESCRIPTION\")\n content: $translate.instant(\"ACTIVITY.FIELDS.CONTENT\")\n status: $translate.instant(\"ACTIVITY.FIELDS.STATUS\")\n is_closed : $translate.instant(\"ACTIVITY.FIELDS.IS_CLOSED\")\n finish_date : $translate.instant(\"ACTIVITY.FIELDS.FINISH_DATE\")\n type: $translate.instant(\"ACTIVITY.FIELDS.TYPE\")\n priority: $translate.instant(\"ACTIVITY.FIELDS.PRIORITY\")\n severity: $translate.instant(\"ACTIVITY.FIELDS.SEVERITY\")\n assigned_to : $translate.instant(\"ACTIVITY.FIELDS.ASSIGNED_TO\")\n watchers : $translate.instant(\"ACTIVITY.FIELDS.WATCHERS\")\n milestone : $translate.instant(\"ACTIVITY.FIELDS.MILESTONE\")\n user_story: $translate.instant(\"ACTIVITY.FIELDS.USER_STORY\")\n project: $translate.instant(\"ACTIVITY.FIELDS.PROJECT\")\n is_blocked: $translate.instant(\"ACTIVITY.FIELDS.IS_BLOCKED\")\n blocked_note: $translate.instant(\"ACTIVITY.FIELDS.BLOCKED_NOTE\")\n points: $translate.instant(\"ACTIVITY.FIELDS.POINTS\")\n client_requirement : $translate.instant(\"ACTIVITY.FIELDS.CLIENT_REQUIREMENT\")\n team_requirement : $translate.instant(\"ACTIVITY.FIELDS.TEAM_REQUIREMENT\")\n is_iocaine: $translate.instant(\"ACTIVITY.FIELDS.IS_IOCAINE\")\n tags: $translate.instant(\"ACTIVITY.FIELDS.TAGS\")\n attachments : $translate.instant(\"ACTIVITY.FIELDS.ATTACHMENTS\")\n is_deprecated: $translate.instant(\"ACTIVITY.FIELDS.IS_DEPRECATED\")\n blocked_note: $translate.instant(\"ACTIVITY.FIELDS.BLOCKED_NOTE\")\n is_blocked: $translate.instant(\"ACTIVITY.FIELDS.IS_BLOCKED\")\n order: $translate.instant(\"ACTIVITY.FIELDS.ORDER\")\n backlog_order: $translate.instant(\"ACTIVITY.FIELDS.BACKLOG_ORDER\")\n sprint_order: $translate.instant(\"ACTIVITY.FIELDS.SPRINT_ORDER\")\n kanban_order: $translate.instant(\"ACTIVITY.FIELDS.KANBAN_ORDER\")\n taskboard_order: $translate.instant(\"ACTIVITY.FIELDS.TASKBOARD_ORDER\")\n us_order: $translate.instant(\"ACTIVITY.FIELDS.US_ORDER\")\n }\n\n return humanizedFieldNames[field] or field\n\n countChanges = (comment) ->\n return _.keys(comment.values_diff).length\n\n formatChange = (change) ->\n if _.isArray(change)\n if change.length == 0\n return $translate.instant(\"ACTIVITY.VALUES.EMPTY\")\n return change.join(\", \")\n\n if change == \"\"\n return $translate.instant(\"ACTIVITY.VALUES.EMPTY\")\n\n if not change? or change == false\n return $translate.instant(\"ACTIVITY.VALUES.NO\")\n\n if change == true\n return $translate.instant(\"ACTIVITY.VALUES.YES\")\n\n return change\n\n # Render into string (operations without mutability)\n\n renderAttachmentEntry = (value) ->\n attachments = _.map value, (changes, type) ->\n if type == \"new\"\n return _.map changes, (change) ->\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.NEW_ATTACHMENT\"),\n diff: change.filename\n })\n else if type == \"deleted\"\n return _.map changes, (change) ->\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.DELETED_ATTACHMENT\"),\n diff: change.filename\n })\n else\n return _.map changes, (change) ->\n name = $translate.instant(\"ACTIVITY.UPDATED_ATTACHMENT\", {filename: change.filename})\n\n diff = _.map change.changes, (values, name) ->\n return {\n name: getHumanizedFieldName(name)\n from: formatChange(values[0])\n to: formatChange(values[1])\n }\n\n return templateChangeAttachment({name: name, diff: diff})\n\n return _.flatten(attachments).join(\"\\n\")\n\n renderCustomAttributesEntry = (value) ->\n customAttributes = _.map value, (changes, type) ->\n if type == \"new\"\n return _.map changes, (change) ->\n html = templateChangeGeneric({\n name: change.name,\n from: formatChange(\"\"),\n to: formatChange(change.value)\n })\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n else if type == \"deleted\"\n return _.map changes, (change) ->\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.DELETED_CUSTOM_ATTRIBUTE\")\n diff: change.name\n })\n else\n return _.map changes, (change) ->\n customAttrsChanges = _.map change.changes, (values) ->\n return templateChangeGeneric({\n name: change.name\n from: formatChange(values[0])\n to: formatChange(values[1])\n })\n return _.flatten(customAttrsChanges).join(\"\\n\")\n\n return _.flatten(customAttributes).join(\"\\n\")\n\n renderChangeEntry = (field, value) ->\n if field == \"description\"\n return templateChangeDiff({name: getHumanizedFieldName(\"description\"), diff: value[1]})\n else if field == \"blocked_note\"\n return templateChangeDiff({name: getHumanizedFieldName(\"blocked_note\"), diff: value[1]})\n else if field == \"points\"\n html = templateChangePoints({points: value})\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n else if field == \"attachments\"\n return renderAttachmentEntry(value)\n else if field == \"custom_attributes\"\n return renderCustomAttributesEntry(value)\n else if field in [\"tags\", \"watchers\"]\n name = getHumanizedFieldName(field)\n removed = _.difference(value[0], value[1])\n added = _.difference(value[1], value[0])\n html = templateChangeList({name:name, removed:removed, added: added})\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n else if field == \"assigned_to\"\n name = getHumanizedFieldName(field)\n from = formatChange(value[0] or $translate.instant(\"ACTIVITY.VALUES.UNASSIGNED\"))\n to = formatChange(value[1] or $translate.instant(\"ACTIVITY.VALUES.UNASSIGNED\"))\n return templateChangeGeneric({name:name, from:from, to: to})\n else\n name = getHumanizedFieldName(field)\n from = formatChange(value[0])\n to = formatChange(value[1])\n return templateChangeGeneric({name:name, from:from, to: to})\n\n renderChangeEntries = (change) ->\n changeModel = change.key.split(\":\")[0]\n if IGNORED_FIELDS[changeModel]?\n change.values_diff = _.removeKeys(change.values_diff, IGNORED_FIELDS[changeModel])\n\n return _.map(change.values_diff, (value, field) -> renderChangeEntry(field, value))\n\n renderChangesHelperText = (change) ->\n size = countChanges(change)\n return $translate.instant(\"ACTIVITY.SIZE_CHANGE\", {size: size}, 'messageformat')\n\n renderComment = (comment) ->\n if (comment.delete_comment_date or comment.delete_comment_user?.name)\n html = templateDeletedComment({\n deleteCommentDate: moment(comment.delete_comment_date).format(getPrettyDateFormat()) if comment.delete_comment_date\n deleteCommentUser: comment.delete_comment_user.name\n deleteComment: comment.comment_html\n activityId: comment.id\n canRestoreComment: ($scope.user and\n (comment.delete_comment_user.pk == $scope.user.id or\n $scope.project.my_permissions.indexOf(\"modify_project\") > -1))\n })\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n\n html = templateActivity({\n avatar: comment.user.photo\n userFullName: comment.user.name\n userProfileUrl: if comment.user.is_active then $navUrls.resolve(\"user-profile\", {username: comment.user.username}) else \"\"\n creationDate: moment(comment.created_at).format(getPrettyDateFormat())\n comment: comment.comment_html\n changesText: renderChangesHelperText(comment)\n changes: renderChangeEntries(comment)\n mode: \"comment\"\n deleteCommentDate: moment(comment.delete_comment_date).format(getPrettyDateFormat()) if comment.delete_comment_date\n deleteCommentUser: comment.delete_comment_user.name if comment.delete_comment_user?.name\n activityId: comment.id\n canDeleteComment: comment.user.pk == $scope.user?.id or $scope.project.my_permissions.indexOf(\"modify_project\") > -1\n })\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n\n renderChange = (change) ->\n return templateActivity({\n avatar: change.user.photo\n userFullName: change.user.name\n userProfileUrl: if change.user.is_active then $navUrls.resolve(\"user-profile\", {username: change.user.username}) else \"\"\n creationDate: moment(change.created_at).format(getPrettyDateFormat())\n comment: change.comment_html\n changes: renderChangeEntries(change)\n changesText: \"\"\n mode: \"activity\"\n deleteCommentDate: moment(change.delete_comment_date).format(getPrettyDateFormat()) if change.delete_comment_date\n deleteCommentUser: change.delete_comment_user.name if change.delete_comment_user?.name\n activityId: change.id\n })\n\n renderHistory = (entries, totalEntries) ->\n if entries.length == totalEntries\n showMore = 0\n else\n showMore = totalEntries - entries.length\n\n html = templateBaseEntries({entries: entries, showMore:showMore})\n html = $compile(html)($scope)\n return html\n\n # Render into DOM (operations with dom mutability)\n\n renderComments = ->\n comments = $scope.comments or []\n totalComments = comments.length\n if not showAllComments\n comments = _.last(comments, 4)\n\n comments = _.map(comments, (x) -> renderComment(x))\n html = renderHistory(comments, totalComments)\n $el.find(\".comments-list\").html(html)\n\n renderActivity = ->\n changes = $scope.history or []\n totalChanges = changes.length\n if not showAllActivity\n changes = _.last(changes, 4)\n\n changes = _.map(changes, (x) -> renderChange(x))\n html = renderHistory(changes, totalChanges)\n $el.find(\".changes-list\").html(html)\n\n save = $qqueue.bindAdd (target) =>\n $scope.$broadcast(\"markdown-editor:submit\")\n\n $el.find(\".comment-list\").addClass(\"activeanimation\")\n\n currentLoading = $loading()\n .target(target)\n .start()\n\n onSuccess = ->\n $rootScope.$broadcast(\"comment:new\")\n\n $ctrl.loadHistory(type, objectId).finally ->\n currentLoading.finish()\n\n onError = ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n model = $scope.$eval($attrs.ngModel)\n\n $ctrl.repo.save(model).then(onSuccess, onError)\n\n # Watchers\n\n $scope.$watch(\"comments\", renderComments)\n $scope.$watch(\"history\", renderActivity)\n\n $scope.$on(\"object:updated\", -> $ctrl.loadHistory(type, objectId))\n\n # Events\n\n $el.on \"click\", \".add-comment button.button-green\", debounce 2000, (event) ->\n event.preventDefault()\n\n target = angular.element(event.currentTarget)\n save(target)\n\n $el.on \"click\", \"a\", (event) ->\n target = angular.element(event.target)\n href = target.attr('href')\n if href && href.indexOf(\"#\") == 0\n event.preventDefault()\n $('body').scrollTop($(href).offset().top)\n\n $el.on \"click\", \".show-more\", (event) ->\n event.preventDefault()\n\n target = angular.element(event.currentTarget)\n if target.parent().is(\".changes-list\")\n showAllActivity = not showAllActivity\n renderActivity()\n else\n showAllComments = not showAllComments\n renderComments()\n\n $el.on \"click\", \".show-deleted-comment\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.parents('.activity-single').find('.hide-deleted-comment').show()\n target.parents('.activity-single').find('.show-deleted-comment').hide()\n target.parents('.activity-single').find('.comment-body').show()\n\n $el.on \"click\", \".hide-deleted-comment\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.parents('.activity-single').find('.hide-deleted-comment').hide()\n target.parents('.activity-single').find('.show-deleted-comment').show()\n target.parents('.activity-single').find('.comment-body').hide()\n\n $el.on \"click\", \".changes-title\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.parent().find(\".change-entry\").toggleClass(\"active\")\n\n $el.on \"focus\", \".add-comment textarea\", (event) ->\n $(this).addClass('active')\n\n $el.on \"click\", \".history-tabs li a\", (event) ->\n target = angular.element(event.currentTarget)\n\n $el.find(\".history-tabs li a\").removeClass(\"active\")\n target.addClass(\"active\")\n\n $el.find(\".history section\").addClass(\"hidden\")\n $el.find(\".history section.#{target.data('section-class')}\").removeClass(\"hidden\")\n\n $el.on \"click\", \".comment-delete\", debounce 2000, (event) ->\n event.preventDefault()\n\n target = angular.element(event.currentTarget)\n activityId = target.data('activity-id')\n $ctrl.deleteComment(type, objectId, activityId)\n\n $el.on \"click\", \".comment-restore\", debounce 2000, (event) ->\n event.preventDefault()\n\n target = angular.element(event.currentTarget)\n activityId = target.data('activity-id')\n $ctrl.undeleteComment(type, objectId, activityId)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n templateFn = ($el, $attrs) ->\n html = templateBase({ngmodel: $attrs.ngModel, type: $attrs.type, mode: $attrs.mode})\n\n return html\n\n return {\n controller: HistoryController\n template: templateFn\n restrict: \"AE\"\n link: link\n # require: [\"ngModel\", \"tgHistory\"]\n }\n\n\nmodule.directive(\"tgHistory\", [\"$log\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$tgConfirm\", \"$translate\",\n \"$compile\", \"$tgNavUrls\", \"$rootScope\", HistoryDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/importer.coffee\n###\n\nmodule = angular.module(\"taigaCommon\")\n\n\nImportProjectButtonDirective = ($rs, $confirm, $location, $navUrls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $el.on \"click\", \".import-project-button\", (event) ->\n event.preventDefault()\n $el.find(\"input.import-file\").val(\"\")\n $el.find(\"input.import-file\").trigger(\"click\")\n\n $el.on \"change\", \"input.import-file\", (event) ->\n event.preventDefault()\n file = event.target.files[0]\n return if not file\n\n loader = $confirm.loader($translate.instant(\"PROJECT.IMPORT.UPLOADING_FILE\"))\n\n onSuccess = (result) ->\n loader.stop()\n if result.status == 202 # Async mode\n title = $translate.instant(\"PROJECT.IMPORT.ASYNC_IN_PROGRESS_TITLE\")\n message = $translate.instant(\"PROJECT.IMPORT.ASYNC_IN_PROGRESS_MESSAGE\")\n $confirm.success(title, message)\n\n else # result.status == 201 # Sync mode\n ctx = {project: result.data.slug}\n $location.path($navUrls.resolve(\"project-admin-project-profile-details\", ctx))\n msg = $translate.instant(\"PROJECT.IMPORT.SYNC_SUCCESS\")\n $confirm.notify(\"success\", msg)\n\n onError = (result) ->\n loader.stop()\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR\")\n\n if result.status == 429 # TOO MANY REQUESTS\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_TOO_MANY_REQUEST\")\n else if result.data?._error_message\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MESSAGE\", {error_message: result.data._error_message})\n $confirm.notify(\"error\", errorMsg)\n\n loader.start()\n $rs.projects.import(file, loader.update).then(onSuccess, onError)\n\n return {link: link}\n\nmodule.directive(\"tgImportProjectButton\", [\"$tgResources\", \"$tgConfirm\", \"$location\", \"$tgNavUrls\", \"$translate\",\n ImportProjectButtonDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/lightboxes.coffee\n###\n\nmodule = angular.module(\"taigaCommon\")\n\nbindOnce = @.taiga.bindOnce\ntimeout = @.taiga.timeout\ndebounce = @.taiga.debounce\n\n#############################################################################\n## Common Lightbox Services\n#############################################################################\n\n# the lightboxContent hide/show doesn't have sense because is an IE hack\nclass LightboxService extends taiga.Service\n constructor: (@animationFrame, @q) ->\n\n open: ($el) ->\n defered = @q.defer()\n\n lightboxContent = $el.children().not(\".close\")\n lightboxContent.hide()\n\n @animationFrame.add ->\n $el.css('display', 'flex')\n\n @animationFrame.add ->\n $el.addClass(\"open\")\n\n @animationFrame.add ->\n $el.find('input,textarea').first().focus()\n\n @animationFrame.add =>\n lightboxContent.show()\n defered.resolve()\n\n docEl = angular.element(document)\n docEl.on \"keydown.lightbox\", (e) =>\n code = if e.keyCode then e.keyCode else e.which\n @.close($el) if code == 27\n\n return defered.promise\n\n close: ($el) ->\n docEl = angular.element(document)\n docEl.off(\".lightbox\")\n docEl.off(\".keyboard-navigation\") # Hack: to fix problems in the WYSIWYG textareas when press ENTER\n $el.one \"transitionend\", =>\n $el.removeAttr('style')\n $el.removeClass(\"open\").removeClass('close')\n\n $el.addClass('close')\n\n if $el.hasClass(\"remove-on-close\")\n scope = $el.data(\"scope\")\n scope.$destroy()\n $el.remove()\n\n closeAll: ->\n docEl = angular.element(document)\n for lightboxEl in docEl.find(\".lightbox.open\")\n @.close($(lightboxEl))\n\n\nmodule.service(\"lightboxService\", [\"animationFrame\", \"$q\", LightboxService])\n\n\nclass LightboxKeyboardNavigationService extends taiga.Service\n stop: ->\n docEl = angular.element(document)\n docEl.off(\".keyboard-navigation\")\n\n dispatch: ($el, code) ->\n activeElement = $el.find(\".active\")\n\n # Key: enter\n if code == 13\n if $el.find(\".watcher-single\").length == 1\n $el.find('.watcher-single:first').trigger(\"click\")\n else\n activeElement.trigger(\"click\")\n\n # Key: down\n else if code == 40\n if not activeElement.length\n $el.find('.watcher-single:first').addClass('active')\n else\n next = activeElement.next('.watcher-single')\n if next.length\n activeElement.removeClass('active')\n next.addClass('active')\n # Key: up\n else if code == 38\n if not activeElement.length\n $el.find('.watcher-single:last').addClass('active')\n else\n prev = activeElement.prev('.watcher-single')\n\n if prev.length\n activeElement.removeClass('active')\n prev.addClass('active')\n\n init: ($el) ->\n @stop()\n docEl = angular.element(document)\n docEl.on \"keydown.keyboard-navigation\", (event) =>\n code = if event.keyCode then event.keyCode else event.which\n if code == 40 || code == 38 || code == 13\n event.preventDefault()\n @.dispatch($el, code)\n\nmodule.service(\"lightboxKeyboardNavigationService\", LightboxKeyboardNavigationService)\n\n\n#############################################################################\n## Generic Lighthbox Directive\n#############################################################################\n\n# This adds generic behavior to all blocks with lightbox class like\n# close button event handlers.\n\nLightboxDirective = (lightboxService) ->\n link = ($scope, $el, $attrs) ->\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n lightboxService.close($el)\n\n return {restrict: \"C\", link: link}\n\nmodule.directive(\"lightbox\", [\"lightboxService\", LightboxDirective])\n\n#############################################################################\n## Block Lightbox Directive\n#############################################################################\n\n# Issue/Userstory blocking message lightbox directive.\n\nBlockLightboxDirective = ($rootscope, $tgrepo, $confirm, lightboxService, $loading, $qqueue, $translate) ->\n link = ($scope, $el, $attrs, $model) ->\n title = $translate.instant($attrs.title)\n $el.find(\"h2.title\").text(title)\n\n unblock = $qqueue.bindAdd (item, finishCallback) =>\n promise = $tgrepo.save(item)\n promise.then ->\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n $model.$setViewValue(item)\n finishCallback()\n\n promise.then null, ->\n $confirm.notify(\"error\")\n item.revert()\n $model.$setViewValue(item)\n\n promise.finally ->\n finishCallback()\n\n return promise\n\n block = $qqueue.bindAdd (item) =>\n $model.$setViewValue(item)\n\n currentLoading = $loading()\n .target($el.find(\".button-green\"))\n .start()\n\n promise = $tgrepo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n $confirm.notify(\"error\")\n item.revert()\n $model.$setViewValue(item)\n\n promise.finally ->\n currentLoading.finish()\n lightboxService.close($el)\n\n $scope.$on \"block\", ->\n $el.find(\".reason\").val($model.$modelValue.blocked_note)\n lightboxService.open($el)\n\n $scope.$on \"unblock\", (event, model, finishCallback) =>\n item = $model.$modelValue.clone()\n item.is_blocked = false\n item.blocked_note = \"\"\n\n unblock(item, finishCallback)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $el.on \"click\", \".button-green\", (event) ->\n event.preventDefault()\n\n item = $model.$modelValue.clone()\n item.is_blocked = true\n item.blocked_note = $el.find(\".reason\").val()\n\n block(item)\n\n return {\n templateUrl: \"common/lightbox/lightbox-block.html\"\n link: link\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgLbBlock\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"lightboxService\", \"$tgLoading\", \"$tgQqueue\", \"$translate\", BlockLightboxDirective])\n\n\n#############################################################################\n## Generic Lightbox Blocking-Message Input Directive\n#############################################################################\n\nBlockingMessageInputDirective = ($log, $template, $compile) ->\n template = $template.get(\"common/lightbox/lightbox-blocking-message-input.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n if not $attrs.watch\n return $log.error \"No watch attribute on tg-blocking-message-input directive\"\n\n $scope.$watch $attrs.watch, (value) ->\n if value is not undefined and value == true\n $el.find(\".blocked-note\").removeClass(\"hidden\")\n else\n $el.find(\".blocked-note\").addClass(\"hidden\")\n\n templateFn = ($el, $attrs) ->\n return template({ngmodel: $attrs.ngModel})\n\n return {\n template: templateFn\n link: link\n require: \"ngModel\"\n restrict: \"EA\"\n }\n\nmodule.directive(\"tgBlockingMessageInput\", [\"$log\", \"$tgTemplate\", \"$compile\", BlockingMessageInputDirective])\n\n\n#############################################################################\n## Create/Edit Userstory Lightbox Directive\n#############################################################################\n\nCreateEditUserstoryDirective = ($repo, $model, $rs, $rootScope, lightboxService, $loading, $translate) ->\n link = ($scope, $el, attrs) ->\n $scope.isNew = true\n\n $scope.$on \"usform:new\", (ctx, projectId, status, statusList) ->\n $scope.isNew = true\n $scope.usStatusList = statusList\n\n $scope.us = $model.make_model(\"userstories\", {\n project: projectId\n points : {}\n status: status\n is_archived: false\n tags: []\n })\n\n # Update texts for creation\n $el.find(\".button-green\").html($translate.instant(\"COMMON.CREATE\"))\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.NEW_US\"))\n $el.find(\".tag-input\").val(\"\")\n\n $el.find(\".blocked-note\").addClass(\"hidden\")\n $el.find(\"label.blocked\").removeClass(\"selected\")\n $el.find(\"label.team-requirement\").removeClass(\"selected\")\n $el.find(\"label.client-requirement\").removeClass(\"selected\")\n\n lightboxService.open($el)\n\n $scope.$on \"usform:edit\", (ctx, us) ->\n $scope.us = us\n $scope.isNew = false\n\n # Update texts for edition\n $el.find(\".button-green\").html($translate.instant(\"COMMON.SAVE\"))\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.EDIT_US\"))\n $el.find(\".tag-input\").val(\"\")\n\n # Update requirement info (team, client or blocked)\n if us.is_blocked\n $el.find(\".blocked-note\").removeClass(\"hidden\")\n $el.find(\"label.blocked\").addClass(\"selected\")\n else\n $el.find(\".blocked-note\").addClass(\"hidden\")\n $el.find(\"label.blocked\").removeClass(\"selected\")\n\n if us.team_requirement\n $el.find(\"label.team-requirement\").addClass(\"selected\")\n else\n $el.find(\"label.team-requirement\").removeClass(\"selected\")\n if us.client_requirement\n $el.find(\"label.client-requirement\").addClass(\"selected\")\n else\n $el.find(\"label.client-requirement\").removeClass(\"selected\")\n\n lightboxService.open($el)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n if $scope.isNew\n promise = $repo.create(\"userstories\", $scope.us)\n broadcastEvent = \"usform:new:success\"\n else\n promise = $repo.save($scope.us)\n broadcastEvent = \"usform:edit:success\"\n\n promise.then (data) ->\n currentLoading.finish()\n lightboxService.close($el)\n $rootScope.$broadcast(broadcastEvent, data)\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $scope.us.revert()\n lightboxService.close($el)\n\n $el.keydown (event) ->\n code = if event.keyCode then event.keyCode else event.which\n if code == 27\n lightboxService.close($el)\n $scope.$apply ->\n $scope.us.revert()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgLbCreateEditUserstory\", [\n \"$tgRepo\",\n \"$tgModel\",\n \"$tgResources\",\n \"$rootScope\",\n \"lightboxService\",\n \"$tgLoading\",\n \"$translate\",\n CreateEditUserstoryDirective\n])\n\n\n#############################################################################\n## Creare Bulk Userstories Lightbox Directive\n#############################################################################\n\nCreateBulkUserstoriesDirective = ($repo, $rs, $rootscope, lightboxService, $loading) ->\n link = ($scope, $el, attrs) ->\n $scope.$on \"usform:bulk\", (ctx, projectId, status) ->\n $scope.new = {\n projectId: projectId\n statusId: status\n bulk: \"\"\n }\n lightboxService.open($el)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley({onlyOneErrorElement: true})\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $rs.userstories.bulkCreate($scope.new.projectId, $scope.new.statusId, $scope.new.bulk)\n promise.then (result) ->\n currentLoading.finish()\n $rootscope.$broadcast(\"usform:bulk:success\", result)\n lightboxService.close($el)\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgLbCreateBulkUserstories\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n \"lightboxService\",\n \"$tgLoading\",\n CreateBulkUserstoriesDirective\n])\n\n\n#############################################################################\n## AssignedTo Lightbox Directive\n#############################################################################\n\nAssignedToLightboxDirective = (lightboxService, lightboxKeyboardNavigationService, $template, $compile) ->\n link = ($scope, $el, $attrs) ->\n selectedUser = null\n selectedItem = null\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true)\n\n normalizeString = (string) ->\n normalizedString = string\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\")\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\")\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\")\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\")\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\")\n return normalizedString\n\n filterUsers = (text, user) ->\n username = user.full_name_display.toUpperCase()\n username = normalizeString(username)\n text = text.toUpperCase()\n text = normalizeString(text)\n return _.contains(username, text)\n\n render = (selected, text) ->\n users = _.clone($scope.activeUsers, true)\n users = _.reject(users, {\"id\": selected.id}) if selected?\n users = _.filter(users, _.partial(filterUsers, text)) if text?\n\n ctx = {\n selected: selected\n users: _.first(users, 5)\n showMore: users.length > 5\n }\n\n html = usersTemplate(ctx)\n html = $compile(html)($scope)\n\n $el.find(\".assigned-to-list\").html(html)\n\n closeLightbox = () ->\n lightboxKeyboardNavigationService.stop()\n lightboxService.close($el)\n\n $scope.$on \"assigned-to:add\", (ctx, item) ->\n selectedItem = item\n assignedToId = item.assigned_to\n selectedUser = $scope.usersById[assignedToId]\n\n render(selectedUser)\n lightboxService.open($el).then ->\n $el.find('input').focus()\n lightboxKeyboardNavigationService.init($el)\n\n $scope.$watch \"usersSearch\", (searchingText) ->\n if searchingText?\n render(selectedUser, searchingText)\n $el.find('input').focus()\n\n $el.on \"click\", \".user-list-single\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n closeLightbox()\n\n $scope.$apply ->\n $scope.$broadcast(\"assigned-to:added\", target.data(\"user-id\"), selectedItem)\n $scope.usersSearch = null\n\n $el.on \"click\", \".remove-assigned-to\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n\n closeLightbox()\n\n $scope.$apply ->\n $scope.usersSearch = null\n $scope.$broadcast(\"assigned-to:added\", null, selectedItem)\n\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n\n closeLightbox()\n\n $scope.$apply ->\n $scope.usersSearch = null\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n templateUrl: \"common/lightbox/lightbox-assigned-to.html\"\n link:link\n }\n\n\nmodule.directive(\"tgLbAssignedto\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", AssignedToLightboxDirective])\n\n\n#############################################################################\n## Watchers Lightbox directive\n#############################################################################\n\nWatchersLightboxDirective = ($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile) ->\n link = ($scope, $el, $attrs) ->\n selectedItem = null\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true)\n\n # Get prefiltered users by text\n # and without now watched users.\n getFilteredUsers = (text=\"\") ->\n _filterUsers = (text, user) ->\n if selectedItem && _.find(selectedItem.watchers, (x) -> x == user.id)\n return false\n\n username = user.full_name_display.toUpperCase()\n text = text.toUpperCase()\n return _.contains(username, text)\n\n users = _.clone($scope.activeUsers, true)\n users = _.filter(users, _.partial(_filterUsers, text))\n return users\n\n # Render the specific list of users.\n render = (users) ->\n ctx = {\n selected: false\n users: _.first(users, 5)\n showMore: users.length > 5\n }\n\n html = usersTemplate(ctx)\n html = $compile(html)($scope)\n $el.find(\".ticket-watchers\").html(html)\n\n closeLightbox = () ->\n lightboxKeyboardNavigationService.stop()\n lightboxService.close($el)\n\n $scope.$on \"watcher:add\", (ctx, item) ->\n selectedItem = item\n\n users = getFilteredUsers()\n render(users)\n\n lightboxService.open($el).then ->\n $el.find(\"input\").focus()\n lightboxKeyboardNavigationService.init($el)\n\n $scope.$watch \"usersSearch\", (searchingText) ->\n if not searchingText?\n return\n\n users = getFilteredUsers(searchingText)\n render(users)\n $el.find(\"input\").focus()\n\n $el.on \"click\", \".user-list-single\", debounce 2000, (event) ->\n closeLightbox()\n\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n $scope.$apply ->\n $scope.usersSearch = null\n $scope.$broadcast(\"watcher:added\", target.data(\"user-id\"))\n\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n\n closeLightbox()\n\n $scope.$apply ->\n $scope.usersSearch = null\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n templateUrl: \"common/lightbox/lightbox-users.html\"\n link:link\n }\n\nmodule.directive(\"tgLbWatchers\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", WatchersLightboxDirective])\n\n\n#############################################################################\n## Attachment Preview Lighbox\n#############################################################################\n\nAttachmentPreviewLightboxDirective = ($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile) ->\n link = ($scope, $el, attrs) ->\n template = $template.get(\"common/lightbox/lightbox-attachment-preview.html\", true)\n\n $scope.$on \"attachment:preview\", (event, attachment) ->\n lightboxService.open($el)\n render(attachment)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n render = (attachment) ->\n ctx = {\n url: attachment.url,\n title: attachment.description,\n name: attachment.name\n }\n\n html = template(ctx)\n html = $compile(html)($scope)\n $el.html(html)\n\n return {\n link: link\n }\n\nmodule.directive(\"tgLbAttachmentPreview\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", AttachmentPreviewLightboxDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n# Copyright (C) 2014-2015 Juan Francisco Alcántara \n# Copyright (C) 2014-2015 Alejandro Alonso \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/loader.coffee\n###\n\n# FIXME: this code not follows any style and any good practices on coffeescript\n# and it should be rewritten in coffeescript style classes.\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\ntimeout = @.taiga.timeout\n\nmodule = angular.module(\"taigaCommon\")\n\nLoaderDirective = (tgLoader, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n tgLoader.onStart () ->\n $(document.body).addClass(\"loader-active\")\n $el.addClass(\"active\")\n\n tgLoader.onEnd () ->\n $(document.body).removeClass(\"loader-active\")\n $el.removeClass(\"active\")\n\n return {\n link: link\n }\n\nmodule.directive(\"tgLoader\", [\"tgLoader\", \"$rootScope\", LoaderDirective])\n\nLoader = ($rootscope) ->\n config = {\n minTime: 300\n }\n\n open = false\n startLoadTime = 0\n requestCount = 0\n lastResponseDate = 0\n\n pageLoaded = (force = false) ->\n if startLoadTime\n timeoutValue = 0\n\n if !force\n endTime = new Date().getTime()\n diff = endTime - startLoadTime\n\n if diff < config.minTime\n timeoutValue = config.minTime - diff\n\n timeout timeoutValue, ->\n $rootscope.$broadcast(\"loader:end\")\n open = false\n window.prerenderReady = true # Needed by Prerender Server\n\n startLoadTime = 0\n requestCount = 0\n lastResponseDate = 0\n\n autoClose = () ->\n intervalAuto = setInterval (() ->\n if lastResponseDate && requestCount == 0\n pageLoaded()\n\n clearInterval(intervalAuto)\n ), 50\n\n start = () ->\n startLoadTime = new Date().getTime()\n $rootscope.$broadcast(\"loader:start\")\n open = true\n\n return {\n pageLoaded: pageLoaded\n start: (auto=false) ->\n if !open\n start()\n autoClose() if auto\n onStart: (fn) ->\n $rootscope.$on(\"loader:start\", fn)\n\n onEnd: (fn) ->\n $rootscope.$on(\"loader:end\", fn)\n\n logRequest: () ->\n requestCount++\n\n logResponse: () ->\n requestCount--\n lastResponseDate = new Date().getTime()\n }\n\n\nLoader.$inject = [\"$rootScope\"]\n\nmodule.factory(\"tgLoader\", Loader)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/lightboxes.coffee\n###\n\nmodule = angular.module(\"taigaCommon\")\n\nTgLoadingService = ($compile) ->\n spinner = \"loading...\"\n\n return () ->\n service = {\n settings: {\n target: null,\n scope: null,\n classes: []\n timeout: 0,\n template: null\n },\n target: (target) ->\n service.settings.target = target\n\n return service\n scope: (scope) ->\n service.settings.scope = scope\n\n return service\n template: (template) ->\n service.settings.template = template\n\n return service\n removeClasses: (classess...) ->\n service.settings.classes = classess\n\n return service\n timeout: (timeout) ->\n service.settings.timeout = timeout\n\n return service\n\n start: ->\n target = service.settings.target\n service.settings.classes.map (className) -> target.removeClass(className)\n\n # The loader is shown after that quantity of milliseconds\n timeoutId = setTimeout (->\n if not target.hasClass('loading')\n if !service.settings.template\n service.settings.template = target.html()\n\n target.addClass('loading')\n\n target.html(spinner)\n ), service.settings.timeout\n\n service.settings.timeoutId = timeoutId\n\n return service\n\n finish: ->\n target = service.settings.target\n timeoutId = service.settings.timeoutId\n\n if timeoutId\n clearTimeout(timeoutId)\n\n removeClasses = service.settings.classes\n removeClasses.map (className) -> service.settings.target.addClass(className)\n\n target.html(service.settings.template)\n target.removeClass('loading')\n\n if service.settings.scope\n $compile(target.contents())(service.settings.scope)\n\n return service\n }\n\n return service\n\nTgLoadingService.$inject = [\n \"$compile\"\n]\n\nmodule.factory(\"$tgLoading\", TgLoadingService)\n\nLoadingDirective = ($loading) ->\n link = ($scope, $el, attr) ->\n currentLoading = null\n template = $el.html()\n\n $scope.$watch attr.tgLoading, (showLoading) =>\n if showLoading\n currentLoading = $loading()\n .target($el)\n .timeout(50)\n .template(template)\n .scope($scope)\n .start()\n else if currentLoading\n currentLoading.finish()\n\n return {\n link:link\n }\n\nmodule.directive(\"tgLoading\", [\"$tgLoading\", LoadingDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/popovers.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaCommon\")\n\n#############################################################################\n## UserStory status Directive (popover for change status)\n#############################################################################\n\nUsStatusDirective = ($repo, $template) ->\n ###\n Print the status of a US and a popover to change it.\n - tg-us-status: The user story\n - on-update: Method call after US is updated\n\n Example:\n\n div.status(tg-us-status=\"us\" on-update=\"ctrl.loadSprintState()\")\n a.us-status(href=\"\", title=\"Status Name\")\n\n NOTE: This directive need 'usStatusById' and 'project'.\n ###\n template = $template.get(\"common/popover/popover-us-status.html\", true)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n render = (us) ->\n usStatusDomParent = $el.find(\".us-status\")\n usStatusDom = $el.find(\".us-status .us-status-bind\")\n usStatusById = $scope.usStatusById\n\n if usStatusById[us.status]\n usStatusDom.text(usStatusById[us.status].name)\n usStatusDomParent.css(\"color\", usStatusById[us.status].color)\n\n $el.on \"click\", \".us-status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", debounce 2000, (event) ->\n event.preventDefault()\n event.stopPropagation()\n\n target = angular.element(event.currentTarget)\n\n us = $scope.$eval($attrs.tgUsStatus)\n us.status = target.data(\"status-id\")\n render(us)\n\n $el.find(\".pop-status\").popover().close()\n\n $scope.$apply () ->\n $repo.save(us).then ->\n $scope.$eval($attrs.onUpdate)\n\n\n $scope.$on(\"userstories:loaded\", -> render($scope.$eval($attrs.tgUsStatus)))\n $scope.$on(\"$destroy\", -> $el.off())\n\n # Bootstrap\n us = $scope.$eval($attrs.tgUsStatus)\n render(us)\n\n bindOnce $scope, \"project\", (project) ->\n html = template({\"statuses\": project.us_statuses})\n $el.append(html)\n\n # If the user has not enough permissions the click events are unbinded\n if $scope.project.my_permissions.indexOf(\"modify_us\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n\n return {link: link}\n\nmodule.directive(\"tgUsStatus\", [\"$tgRepo\", \"$tgTemplate\", UsStatusDirective])\n\n#############################################################################\n## Related Task Status Directive\n#############################################################################\n\nRelatedTaskStatusDirective = ($repo, $template) ->\n ###\n Print the status of a related task and a popover to change it.\n - tg-related-task-status: The related task\n - on-update: Method call after US is updated\n\n Example:\n\n div.status(tg-related-task-status=\"task\" on-update=\"ctrl.loadSprintState()\")\n a.task-status(href=\"\", title=\"Status Name\")\n\n NOTE: This directive need 'taskStatusById' and 'project'.\n ###\n selectionTemplate = $template.get(\"common/popover/popover-related-task-status.html\", true)\n\n updateTaskStatus = ($el, task, taskStatusById) ->\n taskStatusDomParent = $el.find(\".us-status\")\n taskStatusDom = $el.find(\".task-status .task-status-bind\")\n\n if taskStatusById[task.status]\n taskStatusDom.text(taskStatusById[task.status].name)\n taskStatusDomParent.css('color', taskStatusById[task.status].color)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n task = $scope.$eval($attrs.tgRelatedTaskStatus)\n notAutoSave = $scope.$eval($attrs.notAutoSave)\n autoSave = !notAutoSave\n\n $el.on \"click\", \".task-status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n\n $el.find(\".pop-status\").popover().open()\n\n # pop = $el.find(\".pop-status\")\n # popoverService.open(pop)\n\n $el.on \"click\", \".status\", debounce 2000, (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n task.status = target.data(\"status-id\")\n $el.find(\".pop-status\").popover().close()\n updateTaskStatus($el, task, $scope.taskStatusById)\n\n if autoSave\n $scope.$apply () ->\n $repo.save(task).then ->\n $scope.$eval($attrs.onUpdate)\n $scope.$emit(\"related-tasks:status-changed\")\n\n taiga.bindOnce $scope, \"project\", (project) ->\n $el.append(selectionTemplate({ 'statuses': project.task_statuses }))\n updateTaskStatus($el, task, $scope.taskStatusById)\n\n # If the user has not enough permissions the click events are unbinded\n if project.my_permissions.indexOf(\"modify_task\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgRelatedTaskStatus\", [\"$tgRepo\", \"$tgTemplate\", RelatedTaskStatusDirective])\n\n#############################################################################\n## jQuery plugin for Popover\n#############################################################################\n\n$.fn.popover = () ->\n $el = @\n\n isVisible = () =>\n $el.css({\n \"display\": \"block\",\n \"visibility\": \"hidden\"\n })\n\n docViewTop = $(window).scrollTop()\n docViewBottom = docViewTop + $(window).height()\n\n docViewWidth = $(window).width()\n docViewRight = docViewWidth\n docViewLeft = 0\n\n elemTop = $el.offset().top\n elemBottom = elemTop + $el.height()\n\n elemWidth = $el.width()\n elemLeft = $el.offset().left\n elemRight = $el.offset().left + elemWidth\n\n $el.css({\n \"display\": \"none\",\n \"visibility\": \"visible\"\n })\n\n return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop) && (elemLeft >= docViewLeft) && (elemRight <= docViewRight))\n\n closePopover = (onClose) =>\n if onClose then onClose.call($el)\n\n $el.fadeOut () =>\n $el\n .removeClass(\"active\")\n .removeClass(\"fix\")\n\n $el.off(\"popup:close\")\n\n\n closeAll = () =>\n $(\".popover.active\").each () ->\n $(this).trigger(\"popup:close\")\n\n open = (onClose) =>\n if $el.hasClass(\"active\")\n close()\n else\n closeAll()\n\n if !isVisible()\n $el.addClass(\"fix\")\n\n $el.fadeIn () =>\n $el.addClass(\"active\")\n $(document.body).off(\"popover\")\n\n $(document.body).one \"click.popover\", () =>\n closeAll()\n\n $el.on \"popup:close\", (e) => closePopover(onClose)\n\n close = () =>\n $el.trigger(\"popup:close\")\n\n return {open: open, close: close, closeAll: closeAll}\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/raven-logger.coffee\n###\n\n\ntaiga = @.taiga\n\nmodule = angular.module(\"taigaCommon\")\n\nExceptionHandlerFactory = ($log, @config) ->\n ravenConfig = @config.get(\"ravenConfig\", null)\n if ravenConfig\n $log.debug \"Using the RavenJS exception handler.\"\n Raven.config(ravenConfig).install()\n return (exception, cause) ->\n $log.error.apply($log, arguments)\n Raven.captureException(exception)\n\n else\n $log.debug \"Using the default logging exception handler.\"\n return (exception, cause) ->\n $log.error.apply($log, arguments)\n\nmodule.factory(\"$exceptionHandler\", [\"$log\", \"$tgConfig\", ExceptionHandlerFactory])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/tags.coffee\n###\n\ntaiga = @.taiga\ntrim = @.taiga.trim\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaCommon\")\n\n# Directive that parses/format tags inputfield.\n\nTagsDirective = ->\n formatter = (v) ->\n if _.isArray(v)\n return v.join(\", \")\n return \"\"\n\n parser = (v) ->\n return [] if not v\n result = _(v.split(\",\")).map((x) -> _.str.trim(x))\n\n return result.value()\n\n link = ($scope, $el, $attrs, $ctrl) ->\n $ctrl.$formatters.push(formatter)\n $ctrl.$parsers.push(parser)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n require: \"ngModel\"\n link: link\n }\n\nmodule.directive(\"tgTags\", TagsDirective)\n\n\nColorizeTagsDirective = ->\n templates = {\n backlog: _.template(\"\"\"\n <% _.each(tags, function(tag) { %>\n \"><%- tag.name %>\n <% }) %>\n \"\"\")\n kanban: _.template(\"\"\"\n <% _.each(tags, function(tag) { %>\n \" title=\"<%- tag.name %>\" />\n <% }) %>\n \"\"\")\n taskboard: _.template(\"\"\"\n <% _.each(tags, function(tag) { %>\n \" title=\"<%- tag.name %>\" />\n <% }) %>\n \"\"\")\n }\n\n link = ($scope, $el, $attrs, $ctrl) ->\n render = (srcTags) ->\n template = templates[$attrs.tgColorizeTagsType]\n srcTags.sort()\n tags = _.map srcTags, (tag) ->\n color = $scope.project.tags_colors[tag]\n return {name: tag, color: color}\n\n html = template({tags: tags})\n $el.html(html)\n\n $scope.$watch $attrs.tgColorizeTags, (tags) ->\n render(tags) if tags?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgColorizeTags\", ColorizeTagsDirective)\n\n\n#############################################################################\n## TagLine Directive (for Lightboxes)\n#############################################################################\n\nLbTagLineDirective = ($rs, $template, $compile) ->\n ENTER_KEY = 13\n COMMA_KEY = 188\n\n templateTags = $template.get(\"common/tag/lb-tag-line-tags.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n ## Render\n renderTags = (tags, tagsColors) ->\n ctx = {\n tags: _.map(tags, (t) -> {name: t, color: tagsColors[t]})\n }\n\n _.map ctx.tags, (tag) =>\n if tag.color\n tag.style = \"border-left: 5px solid #{tag.color}\"\n\n html = $compile(templateTags(ctx))($scope)\n $el.find(\"div.tags-container\").html(html)\n\n showSaveButton = -> $el.find(\".save\").removeClass(\"hidden\")\n hideSaveButton = -> $el.find(\".save\").addClass(\"hidden\")\n\n resetInput = ->\n $el.find(\"input\").val(\"\")\n $el.find(\"input\").autocomplete(\"close\")\n\n ## Aux methods\n addValue = (value) ->\n value = trim(value.toLowerCase())\n return if value.length == 0\n\n tags = _.clone($model.$modelValue, false)\n tags = [] if not tags?\n tags.push(value) if value not in tags\n\n $scope.$apply ->\n $model.$setViewValue(tags)\n\n hideSaveButton()\n\n deleteValue = (value) ->\n value = trim(value.toLowerCase())\n return if value.length == 0\n\n tags = _.clone($model.$modelValue, false)\n tags = _.pull(tags, value)\n\n $scope.$apply ->\n $model.$setViewValue(tags)\n\n saveInputTag = () ->\n value = $el.find(\"input\").val()\n\n addValue(value)\n resetInput()\n\n removeInputLastCharacter = (input) =>\n inputValue = input.val()\n input.val inputValue.substring(0, inputValue.length - 1)\n\n ## Events\n $el.on \"keypress\", \"input\", (event) ->\n return if event.keyCode != ENTER_KEY\n event.preventDefault()\n\n $el.on \"keyup\", \"input\", (event) ->\n target = angular.element(event.currentTarget)\n\n if event.keyCode == ENTER_KEY\n saveInputTag()\n else if event.keyCode == COMMA_KEY\n removeInputLastCharacter(target)\n saveInputTag()\n else\n if target.val().length\n showSaveButton()\n else\n hideSaveButton()\n\n $el.on \"click\", \".save\", (event) ->\n event.preventDefault()\n saveInputTag()\n\n $el.on \"click\", \".icon-delete\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n value = target.siblings(\".tag-name\").text()\n deleteValue(value)\n\n bindOnce $scope, \"project\", (project) ->\n positioningFunction = (position, elements) ->\n menu = elements.element.element\n menu.css(\"width\", elements.target.width)\n menu.css(\"top\", position.top)\n menu.css(\"left\", position.left)\n\n $el.find(\"input\").autocomplete({\n source: _.keys(project.tags_colors)\n position: {\n my: \"left top\",\n using: positioningFunction\n }\n select: (event, ui) ->\n addValue(ui.item.value)\n ui.item.value = \"\"\n })\n\n $scope.$watch $attrs.ngModel, (tags) ->\n tagsColors = $scope.project?.tags_colors or []\n renderTags(tags, tagsColors)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link:link,\n require:\"ngModel\"\n templateUrl: \"common/tag/lb-tag-line.html\"\n }\n\nmodule.directive(\"tgLbTagLine\", [\"$tgResources\", \"$tgTemplate\", \"$compile\", LbTagLineDirective])\n\n\n#############################################################################\n## TagLine Directive (for detail pages)\n#############################################################################\n\nTagLineDirective = ($rootScope, $repo, $rs, $confirm, $qqueue, $template, $compile) ->\n ENTER_KEY = 13\n ESC_KEY = 27\n COMMA_KEY = 188\n\n templateTags = $template.get(\"common/tag/tags-line-tags.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n if $attrs.requiredPerm?\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) != -1\n\n return true\n\n ## Render\n renderTags = (tags, tagsColors) ->\n ctx = {\n tags: _.map(tags, (t) -> {name: t, color: tagsColors[t]})\n isEditable: isEditable()\n }\n html = $compile(templateTags(ctx))($scope)\n $el.find(\"div.tags-container\").html(html)\n\n renderInReadModeOnly = ->\n $el.find(\".add-tag\").remove()\n $el.find(\"input\").remove()\n $el.find(\".save\").remove()\n\n showAddTagButton = -> $el.find(\".add-tag\").removeClass(\"hidden\")\n hideAddTagButton = -> $el.find(\".add-tag\").addClass(\"hidden\")\n\n showAddTagButtonText = -> $el.find(\".add-tag-text\").removeClass(\"hidden\")\n hideAddTagButtonText = -> $el.find(\".add-tag-text\").addClass(\"hidden\")\n\n showSaveButton = -> $el.find(\".save\").removeClass(\"hidden\")\n hideSaveButton = -> $el.find(\".save\").addClass(\"hidden\")\n\n showInput = -> $el.find(\"input\").removeClass(\"hidden\").focus()\n hideInput = -> $el.find(\"input\").addClass(\"hidden\").blur()\n resetInput = ->\n $el.find(\"input\").val(\"\")\n $el.find(\"input\").autocomplete(\"close\")\n\n ## Aux methods\n addValue = $qqueue.bindAdd (value) ->\n value = trim(value.toLowerCase())\n return if value.length == 0\n\n tags = _.clone($model.$modelValue.tags, false)\n tags = [] if not tags?\n tags.push(value) if value not in tags\n\n model = $model.$modelValue.clone()\n model.tags = tags\n $model.$setViewValue(model)\n\n onSuccess = ->\n $rootScope.$broadcast(\"object:updated\")\n onError = ->\n $confirm.notify(\"error\")\n model.revert()\n $model.$setViewValue(model)\n $repo.save(model).then(onSuccess, onError)\n\n hideSaveButton()\n\n deleteValue = $qqueue.bindAdd (value) ->\n value = trim(value.toLowerCase())\n return if value.length == 0\n\n tags = _.clone($model.$modelValue.tags, false)\n tags = _.pull(tags, value)\n\n model = $model.$modelValue.clone()\n model.tags = tags\n $model.$setViewValue(model)\n\n onSuccess = ->\n $rootScope.$broadcast(\"object:updated\")\n onError = ->\n $confirm.notify(\"error\")\n model.revert()\n $model.$setViewValue(model)\n\n return $repo.save(model).then(onSuccess, onError)\n\n saveInputTag = () ->\n value = $el.find(\"input\").val()\n\n addValue(value)\n resetInput()\n\n removeInputLastCharacter = (input) =>\n inputValue = input.val()\n input.val inputValue.substring(0, inputValue.length - 1)\n\n ## Events\n $el.on \"keypress\", \"input\", (event) ->\n return if event.keyCode not in [ENTER_KEY, ESC_KEY]\n event.preventDefault()\n\n $el.on \"keyup\", \"input\", (event) ->\n target = angular.element(event.currentTarget)\n\n if event.keyCode == ENTER_KEY\n saveInputTag()\n else if event.keyCode == COMMA_KEY\n removeInputLastCharacter(target)\n saveInputTag()\n else if event.keyCode == ESC_KEY\n resetInput()\n hideInput()\n hideSaveButton()\n showAddTagButton()\n else\n if target.val().length\n showSaveButton()\n else\n hideSaveButton()\n\n $el.on \"click\", \".save\", (event) ->\n event.preventDefault()\n saveInputTag()\n\n $el.on \"click\", \".add-tag\", (event) ->\n event.preventDefault()\n hideAddTagButton()\n showInput()\n\n $el.on \"click\", \".icon-delete\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n value = target.siblings(\".tag-name\").text()\n\n deleteValue(value)\n\n bindOnce $scope, \"project.tags_colors\", (tags_colors) ->\n if not isEditable()\n renderInReadModeOnly()\n return\n\n showAddTagButton()\n\n positioningFunction = (position, elements) ->\n menu = elements.element.element\n menu.css(\"width\", elements.target.width)\n menu.css(\"top\", position.top)\n menu.css(\"left\", position.left)\n\n $el.find(\"input\").autocomplete({\n source: _.keys(tags_colors)\n position: {\n my: \"left top\",\n using: positioningFunction\n }\n select: (event, ui) ->\n addValue(ui.item.value)\n ui.item.value = \"\"\n })\n\n $scope.$watch $attrs.ngModel, (model) ->\n return if not model\n\n if model.tags?.length\n hideAddTagButtonText()\n else\n showAddTagButtonText()\n\n tagsColors = $scope.project?.tags_colors or []\n renderTags(model.tags, tagsColors)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link:link,\n require:\"ngModel\"\n templateUrl: \"common/tag/tag-line.html\"\n }\n\nmodule.directive(\"tgTagLine\", [\"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$tgQqueue\",\n \"$tgTemplate\", \"$compile\", TagLineDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/wisiwyg.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaCommon\")\n\n# How to test lists (-, *, 1.)\n# test it with text after & before the list\n# + is the cursor position\n\n# CASE 1\n# - aa+\n# --> enter\n# - aa\n# - +\n\n# CASE 1\n# - +\n# --> enter\n\n# +\n\n# CASE 3\n# - bb+cc\n# --> enter\n# - bb\n# - cc\n\n# CASE 3\n# +- aa\n# --> enter\n\n# - aa\n\n#############################################################################\n## WYSIWYG markitup editor directive\n#############################################################################\nMarkitupDirective = ($rootscope, $rs, $selectedText, $template, $compile, $translate) ->\n previewTemplate = $template.get(\"common/wysiwyg/wysiwyg-markitup-preview.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n element = angular.element($el)\n previewDomNode = $(\"
\", {class: \"preview\"})\n\n closePreviewMode = ->\n element.parents(\".markdown\").find(\".preview\").remove()\n element.parents(\".markItUp\").show()\n\n $scope.$on \"markdown-editor:submit\", ->\n closePreviewMode()\n\n preview = ->\n markdownDomNode = element.parents(\".markdown\")\n markItUpDomNode = element.parents(\".markItUp\")\n $rs.mdrender.render($scope.projectId, $model.$modelValue).then (data) ->\n html = previewTemplate({data: data.data})\n html = $compile(html)($scope)\n\n markdownDomNode.append(html)\n markItUpDomNode.hide()\n\n markdown = element.closest(\".markdown\")\n\n markdown.on \"mouseup.preview\", \".preview\", (event) ->\n event.preventDefault()\n target = angular.element(event.target)\n\n if !target.is('a') and $selectedText.get().length\n return\n\n markdown.off(\".preview\")\n closePreviewMode()\n\n setCaretPosition = (textarea, caretPosition) ->\n if textarea.createTextRange\n range = textarea.createTextRange()\n range.move(\"character\", caretPosition)\n range.select()\n\n else if textarea.selectionStart\n textarea.focus()\n textarea.setSelectionRange(caretPosition, caretPosition)\n\n # Calculate the scroll position\n totalLines = textarea.value.split(\"\\n\").length\n line = textarea.value[0..(caretPosition - 1)].split(\"\\n\").length\n scrollRelation = line / totalLines\n $el.scrollTop((scrollRelation * $el[0].scrollHeight) - ($el.height() / 2))\n\n addLine = (textarea, nline, replace) ->\n lines = textarea.value.split(\"\\n\")\n\n if replace\n lines[nline] = replace + lines[nline]\n else\n lines[nline] = \"\"\n\n cursorPosition = 0\n\n for line, key in lines\n cursorPosition += line.length + 1 || 1\n\n break if key == nline\n\n textarea.value = lines.join(\"\\n\")\n\n #return the new position\n if replace\n return cursorPosition - lines[nline].length + replace.length - 1\n else\n return cursorPosition\n\n prepareUrlFormatting = (markItUp) ->\n regex = /(<<<|>>>)/gi\n result = 0\n indices = []\n (indices.push(result.index)) while ( (result = regex.exec(markItUp.textarea.value)) )\n markItUp.donotparse = indices\n\n urlFormatting = (markItUp) ->\n regex = /<<>>/gi\n endIndex = 0\n loop\n result = regex.exec(markItUp.textarea.value)\n break if !result\n if result.index not in markItUp.donotparse\n endIndex = result.index\n break\n\n value = markItUp.textarea.value\n url = value.substring(startIndex, endIndex).replace('<<<', '').replace('>>>', '')\n url = url.replace('(', '%28').replace(')', '%29')\n url = url.replace('[', '%5B').replace(']', '%5D')\n value = value.substring(0, startIndex) + url + value.substring(endIndex+3, value.length)\n markItUp.textarea.value = value\n markItUp.donotparse = undefined\n\n markdownTitle = (markItUp, char) ->\n heading = \"\"\n n = $.trim(markItUp.selection or markItUp.placeHolder).length\n\n for i in [0..n-1]\n heading += char\n\n return \"\\n\"+heading+\"\\n\"\n\n renderMarkItUp = () ->\n markdownSettings =\n nameSpace: \"markdown\"\n onShiftEnter: {keepDefault:false, openWith:\"\\n\\n\"}\n onEnter:\n keepDefault: false,\n replaceWith: () ->\n # Allow textcomplete to intercept the enter key if the options list is displayed\n # @todo There doesn't seem to be a more graceful way to do this with the textcomplete API.\n if not $('.textcomplete-dropdown').is(':visible')\n \"\\n\"\n afterInsert: (data) ->\n lines = data.textarea.value.split(\"\\n\")\n # Detect if we are in this situation +- aa at the beginning if the textarea\n if data.caretPosition > 0\n cursorLine = data.textarea.value[0..(data.caretPosition - 1)].split(\"\\n\").length\n else\n cursorLine = 1\n\n newLineContent = data.textarea.value[data.caretPosition..].split(\"\\n\")[0]\n lastLine = lines[cursorLine - 1]\n\n # unordered list -\n match = lastLine.match /^(\\s*- ).*/\n\n if match\n emptyListItem = lastLine.match /^(\\s*)\\-\\s$/\n\n if emptyListItem\n nline = cursorLine - 1\n replace = null\n else\n nline = cursorLine\n replace = \"#{match[1]}\"\n\n markdownCaretPositon = addLine(data.textarea, nline, replace)\n\n # unordered list *\n match = lastLine.match /^(\\s*\\* ).*/\n\n if match\n emptyListItem = lastLine.match /^(\\s*\\* )$/\n\n if emptyListItem\n nline = cursorLine - 1\n replace = null\n else\n nline = cursorLine\n replace = \"#{match[1]}\"\n\n markdownCaretPositon = addLine(data.textarea, nline, replace)\n\n # ordered list\n match = lastLine.match /^(\\s*)(\\d+)\\.\\s/\n\n if match\n emptyListItem = lastLine.match /^(\\s*)(\\d+)\\.\\s$/\n\n if emptyListItem\n nline = cursorLine - 1\n replace = null\n else\n nline = cursorLine\n replace = \"#{match[1] + (parseInt(match[2], 10) + 1)}. \"\n\n markdownCaretPositon = addLine(data.textarea, nline, replace)\n\n setCaretPosition(data.textarea, markdownCaretPositon) if markdownCaretPositon\n\n markupSet: [\n {\n name: $translate.instant(\"COMMON.WYSIWYG.H1_BUTTON\")\n key: \"1\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H1_SAMPLE_TEXT\")\n closeWith: (markItUp) -> markdownTitle(markItUp, \"=\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.H2_BUTTON\")\n key: \"2\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H2_SAMPLE_TEXT\")\n closeWith: (markItUp) -> markdownTitle(markItUp, \"-\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.H3_BUTTON\")\n key: \"3\"\n openWith: \"### \"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H3_SAMPLE_TEXT\")\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.BOLD_BUTTON\")\n key: \"B\"\n openWith: \"**\"\n closeWith: \"**\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.BOLD_BUTTON_SAMPLE_TEXT\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT\")\n key: \"I\"\n openWith: \"_\"\n closeWith: \"_\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.STRIKE_BUTTON\")\n key: \"S\"\n openWith: \"~~\"\n closeWith: \"~~\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.STRIKE_SAMPLE_TEXT\")\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.BULLETED_LIST_BUTTON\")\n openWith: \"- \"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.BULLETED_LIST_SAMPLE_TEXT\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.NUMERIC_LIST_BUTTON\")\n openWith: (markItUp) -> markItUp.line+\". \"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.NUMERIC_LIST_SAMPLE_TEXT\")\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.PICTURE_BUTTON\")\n key: \"P\"\n openWith: \"![\"\n closeWith: '](<<<[![Url:!:http://]!]>>> \"[![Title]!]\")'\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.PICTURE_SAMPLE_TEXT\")\n beforeInsert:(markItUp) -> prepareUrlFormatting(markItUp)\n afterInsert:(markItUp) -> urlFormatting(markItUp)\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.LINK_BUTTON\")\n key: \"L\"\n openWith: \"[\"\n closeWith: '](<<<[![Url:!:http://]!]>>> \"[![Title]!]\")'\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.LINK_SAMPLE_TEXT\")\n beforeInsert:(markItUp) -> prepareUrlFormatting(markItUp)\n afterInsert:(markItUp) -> urlFormatting(markItUp)\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.QUOTE_BLOCK_BUTTON\")\n openWith: \"> \"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.QUOTE_BLOCK_SAMPLE_TEXT\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.CODE_BLOCK_BUTTON\")\n openWith: \"```\\n\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.CODE_BLOCK_SAMPLE_TEXT\")\n closeWith: \"\\n```\"\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.PREVIEW_BUTTON\")\n call: preview\n className: \"preview-icon\"\n },\n ]\n afterInsert: (event) ->\n target = angular.element(event.textarea)\n $model.$setViewValue(target.val())\n\n element\n .markItUpRemove()\n .markItUp(markdownSettings)\n .textcomplete([\n # us, task, and issue autocomplete: #id or #\n {\n cache: true\n match: /(^|\\s)#([a-z0-9]+)$/i,\n search: (term, callback) ->\n term = taiga.slugify(term)\n\n searchTypes = ['issues', 'tasks', 'userstories']\n searchProps = ['ref', 'subject']\n\n filter = (item) =>\n for prop in searchProps\n if taiga.slugify(item[prop]).indexOf(term) >= 0\n return true\n return false\n\n $rs.search.do($scope.projectId, term).then (res) =>\n # ignore wikipages if they're the only results. can't exclude them in search\n if res.count < 1 or res.count == res.wikipages.length\n callback([])\n\n else\n for type in searchTypes\n if res[type] and res[type].length > 0\n callback(res[type].filter(filter), true)\n\n # must signal end of lists\n callback([])\n\n replace: (res) ->\n return \"$1\\##{res.ref} \"\n\n template: (res, term) ->\n return \"\\##{res.ref} - #{res.subject}\"\n }\n\n # username autocomplete: @username or @\n {\n cache: true\n match: /(^|\\s)@([a-z0-9\\-\\._]{2,})$/i\n search: (term, callback) ->\n username = taiga.slugify(term)\n searchProps = ['username', 'full_name', 'full_name_display']\n\n if $scope.project.members.length < 1\n callback([])\n\n else\n callback $scope.project.members.filter (user) =>\n for prop in searchProps\n if taiga.slugify(user[prop]).indexOf(username) >= 0\n return true\n return false\n\n replace: (user) ->\n return \"$1@#{user.username} \"\n\n template: (user) ->\n return \"#{user.username} - #{user.full_name_display}\"\n }\n\n # wiki pages autocomplete: [[slug or [[\n # if the search function was called with the 3rd param the regex\n # like the docs claim, we could combine this with the #123 search\n {\n cache: true\n match: /(^|\\s)\\[\\[([a-z0-9\\-]+)$/i\n search: (term, callback) ->\n term = taiga.slugify(term)\n\n $rs.search.do($scope.projectId, term).then (res) =>\n if res.count < 1\n callback([])\n\n if res.count < 1 or not res.wikipages or res.wikipages.length <= 0\n callback([])\n\n else\n callback res.wikipages.filter((page) =>\n return taiga.slugify(page['slug']).indexOf(term) >= 0\n ), true\n\n # must signal end of lists\n callback([])\n\n\n replace: (res) ->\n return \"$1[[#{res.slug}]]\"\n\n template: (res, term) ->\n return res.slug\n }\n ],\n {\n debounce: 200\n }\n )\n\n renderMarkItUp()\n\n unbind = $rootscope.$on \"$translateChangeEnd\", renderMarkItUp\n\n element.on \"keypress\", (event) ->\n $scope.$apply()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n unbind()\n\n return {link:link, require:\"ngModel\"}\n\nmodule.directive(\"tgMarkitup\", [\"$rootScope\", \"$tgResources\", \"$selectedText\", \"$tgTemplate\", \"$compile\",\n \"$translate\", MarkitupDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ndebounceLeading = @.taiga.debounceLeading\n\n\nmodule = angular.module(\"taigaBacklog\")\n\n#############################################################################\n## Issues Filters Directive\n#############################################################################\n\nBacklogFiltersDirective = ($q, $log, $location, $templates) ->\n template = $templates.get(\"backlog/filters.html\", true)\n templateSelected = $templates.get(\"backlog/filter-selected.html\", true)\n\n link = ($scope, $el, $attrs) ->\n currentFiltersType = ''\n\n $ctrl = $el.closest(\".wrapper\").controller()\n selectedFilters = []\n\n showFilters = (title, type) ->\n $el.find(\".filters-cats\").hide()\n $el.find(\".filter-list\").removeClass(\"hidden\")\n $el.find(\"h2.breadcrumb\").removeClass(\"hidden\")\n $el.find(\"h2 a.subfilter span.title\").html(title)\n $el.find(\"h2 a.subfilter span.title\").prop(\"data-type\", type)\n\n currentFiltersType = getFiltersType()\n\n showCategories = ->\n $el.find(\".filters-cats\").show()\n $el.find(\".filter-list\").addClass(\"hidden\")\n $el.find(\"h2.breadcrumb\").addClass(\"hidden\")\n\n initializeSelectedFilters = () ->\n showCategories()\n selectedFilters = []\n\n for name, values of $scope.filters\n for val in values\n selectedFilters.push(val) if val.selected\n\n renderSelectedFilters()\n\n renderSelectedFilters = ->\n _.map selectedFilters, (f) =>\n if f.color\n f.style = \"border-left: 3px solid #{f.color}\"\n\n html = templateSelected({filters: selectedFilters})\n $el.find(\".filters-applied\").html(html)\n\n renderFilters = (filters) ->\n _.map filters, (f) =>\n if f.color\n f.style = \"border-left: 3px solid #{f.color}\"\n\n html = template({filters:filters})\n $el.find(\".filter-list\").html(html)\n\n getFiltersType = () ->\n return $el.find(\"h2 a.subfilter span.title\").prop('data-type')\n\n reloadUserstories = () ->\n currentFiltersType = getFiltersType()\n\n $q.all([$ctrl.loadUserstories(), $ctrl.generateFilters()]).then () ->\n currentFilters = $scope.filters[currentFiltersType]\n renderFilters(_.reject(currentFilters, \"selected\"))\n\n toggleFilterSelection = (type, id) ->\n currentFiltersType = getFiltersType()\n\n filters = $scope.filters[type]\n filter = _.find(filters, {id: id})\n filter.selected = (not filter.selected)\n\n if filter.selected\n selectedFilters.push(filter)\n $scope.$apply ->\n $ctrl.selectFilter(type, id)\n else\n selectedFilters = _.reject selectedFilters, (selected) ->\n return filter.type == selected.type && filter.id == selected.id\n\n $ctrl.unselectFilter(type, id)\n\n renderSelectedFilters(selectedFilters)\n\n if type == currentFiltersType\n renderFilters(_.reject(filters, \"selected\"))\n\n reloadUserstories()\n\n selectQFilter = debounceLeading 100, (value) ->\n return if value is undefined\n\n if value.length == 0\n $ctrl.replaceFilter(\"q\", null)\n else\n $ctrl.replaceFilter(\"q\", value)\n\n reloadUserstories()\n\n $scope.$watch(\"filtersQ\", selectQFilter)\n\n ## Angular Watchers\n $scope.$on \"backlog:loaded\", (ctx) ->\n initializeSelectedFilters()\n\n $scope.$on \"filters:update\", (ctx) ->\n $ctrl.generateFilters().then () ->\n filters = $scope.filters[currentFiltersType]\n\n if currentFiltersType\n renderFilters(_.reject(filters, \"selected\"))\n\n ## Dom Event Handlers\n $el.on \"click\", \".filters-cats > ul > li > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n tags = $scope.filters[target.data(\"type\")]\n\n renderFilters(_.reject(tags, \"selected\"))\n showFilters(target.attr(\"title\"), target.data('type'))\n\n $el.on \"click\", \".filters-inner > .filters-step-cat > .breadcrumb > .back\", (event) ->\n event.preventDefault()\n showCategories()\n\n $el.on \"click\", \".filters-applied a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n id = target.data(\"id\")\n type = target.data(\"type\")\n toggleFilterSelection(type, id)\n\n $el.on \"click\", \".filter-list .single-filter\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n if target.hasClass(\"active\")\n target.removeClass(\"active\")\n else\n target.addClass(\"active\")\n\n id = target.data(\"id\")\n type = target.data(\"type\")\n toggleFilterSelection(type, id)\n\n return {link:link}\n\nmodule.directive(\"tgBacklogFilters\", [\"$q\", \"$log\", \"$tgLocation\", \"$tgTemplate\", BacklogFiltersDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/lightboxes.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaBacklog\")\n\n#############################################################################\n## Creare/Edit Sprint Lightbox Directive\n#############################################################################\n\nCreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, $translate) ->\n link = ($scope, $el, attrs) ->\n hasErrors = false\n createSprint = true\n\n resetSprint = () ->\n $scope.sprint = {\n project: null\n name: null\n estimated_start: null\n estimated_finish: null\n }\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n target = angular.element(event.currentTarget)\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n\n submitButton = $el.find(\".submit-button\")\n form = $el.find(\"form\").checksley()\n\n if not form.validate()\n hasErrors = true\n $el.find(\".last-sprint-name\").addClass(\"disappear\")\n return\n\n hasErrors = false\n newSprint = angular.copy($scope.sprint)\n broadcastEvent = null\n\n if createSprint\n newSprint.estimated_start = moment(newSprint.estimated_start, prettyDate).format(\"YYYY-MM-DD\")\n newSprint.estimated_finish = moment(newSprint.estimated_finish,prettyDate).format(\"YYYY-MM-DD\")\n promise = $repo.create(\"milestones\", newSprint)\n broadcastEvent = \"sprintform:create:success\"\n else\n newSprint.setAttr(\"estimated_start\",\n moment(newSprint.estimated_start, prettyDate).format(\"YYYY-MM-DD\"))\n newSprint.setAttr(\"estimated_finish\",\n moment(newSprint.estimated_finish, prettyDate).format(\"YYYY-MM-DD\"))\n promise = $repo.save(newSprint)\n broadcastEvent = \"sprintform:edit:success\"\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise.then (data) ->\n currentLoading.finish()\n $scope.sprintsCounter += 1 if createSprint\n $rootscope.$broadcast(broadcastEvent, data)\n\n lightboxService.close($el)\n\n promise.then null, (data) ->\n currentLoading.finish()\n\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"light-error\", data._error_message)\n else if data.__all__\n $confirm.notify(\"light-error\", data.__all__[0])\n\n remove = ->\n title = $translate.instant(\"LIGHTBOX.DELETE_SPRINT.TITLE\")\n message = $scope.sprint.name\n\n $confirm.askOnDelete(title, message).then (askResponse) =>\n onSuccess = ->\n askResponse.finish()\n $scope.milestonesCounter -= 1\n lightboxService.close($el)\n $rootscope.$broadcast(\"sprintform:remove:success\", $scope.sprint)\n\n onError = ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n $repo.remove($scope.sprint).then(onSuccess, onError)\n\n getLastSprint = ->\n openSprints = _.filter $scope.sprints, (sprint) ->\n return !sprint.closed\n\n sortedSprints = _.sortBy openSprints, (sprint) ->\n return moment(sprint.estimated_finish, 'YYYY-MM-DD').format('X')\n\n return sortedSprints[sortedSprints.length - 1]\n\n $scope.$on \"sprintform:create\", (event, projectId) ->\n resetSprint()\n\n form = $el.find(\"form\").checksley()\n form.reset()\n\n createSprint = true\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n $scope.sprint.project = projectId\n $scope.sprint.name = null\n $scope.sprint.slug = null\n\n lastSprint = getLastSprint()\n\n estimatedStart = moment()\n\n if lastSprint\n estimatedStart = moment(lastSprint.estimated_finish)\n else if $scope.sprint.estimated_start\n estimatedStart = moment($scope.sprint.estimated_start)\n\n $scope.sprint.estimated_start = estimatedStart.format(prettyDate)\n\n estimatedFinish = moment().add(2, \"weeks\")\n\n if lastSprint\n estimatedFinish = moment(lastSprint.estimated_finish).add(2, \"weeks\")\n else if $scope.sprint.estimated_finish\n estimatedFinish = moment($scope.sprint.estimated_finish)\n\n $scope.sprint.estimated_finish = estimatedFinish.format(prettyDate)\n\n lastSprintNameDom = $el.find(\".last-sprint-name\")\n if lastSprint?.name?\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME\", {\n lastSprint: lastSprint.name})\n lastSprintNameDom.html(text)\n\n $el.find(\".delete-sprint\").addClass(\"hidden\")\n\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.TITLE\")\n $el.find(\".title\").text(text)\n\n text = $translate.instant(\"COMMON.CREATE\")\n $el.find(\".button-green\").text(text)\n\n lightboxService.open($el)\n $el.find(\".sprint-name\").focus()\n $el.find(\".last-sprint-name\").removeClass(\"disappear\")\n\n $scope.$on \"sprintform:edit\", (ctx, sprint) ->\n resetSprint()\n\n createSprint = false\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n\n $scope.$apply ->\n $scope.sprint = sprint\n $scope.sprint.estimated_start = moment($scope.sprint.estimated_start).format(prettyDate)\n $scope.sprint.estimated_finish = moment($scope.sprint.estimated_finish).format(prettyDate)\n\n $el.find(\".delete-sprint\").removeClass(\"hidden\")\n\n editSprint = $translate.instant(\"BACKLOG.EDIT_SPRINT\")\n $el.find(\".title\").text(editSprint)\n\n save = $translate.instant(\"COMMON.SAVE\")\n $el.find(\".button-green\").text(save)\n\n lightboxService.open($el)\n $el.find(\".sprint-name\").focus().select()\n $el.find(\".last-sprint-name\").addClass(\"disappear\")\n\n $el.on \"keyup\", \".sprint-name\", (event) ->\n if $el.find(\".sprint-name\").val().length > 0 or hasErrors\n $el.find(\".last-sprint-name\").addClass(\"disappear\")\n else\n $el.find(\".last-sprint-name\").removeClass(\"disappear\")\n\n $el.on \"submit\", \"form\", submit\n\n $el.on \"click\", \".delete-sprint .icon-delete\", (event) ->\n event.preventDefault()\n remove()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n resetSprint()\n\n return {link: link}\n\n\nmodule.directive(\"tgLbCreateEditSprint\", [\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$rootScope\",\n \"lightboxService\"\n \"$tgLoading\",\n \"$translate\",\n CreateEditSprint\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ntimeout = @.taiga.timeout\nbindMethods = @.taiga.bindMethods\ngenerateHash = @.taiga.generateHash\n\nmodule = angular.module(\"taigaBacklog\")\n\n#############################################################################\n## Backlog Controller\n#############################################################################\n\nclass BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgEvents\",\n \"$tgAnalytics\",\n \"$translate\",\n \"$tgLoading\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q,\n @location, @appMetaService, @navUrls, @events, @analytics, @translate, @loading) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"BACKLOG.SECTION_NAME\")\n @showTags = false\n @activeFilters = false\n @scope.showGraphPlaceholder = null\n\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n title = @translate.instant(\"BACKLOG.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"BACKLOG.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n if @rs.userstories.getShowTags(@scope.projectId)\n @showTags = true\n\n @scope.$broadcast(\"showTags\", @showTags)\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n initializeEventHandlers: ->\n @scope.$on \"usform:bulk:success\", =>\n @.loadUserstories()\n @.loadProjectStats()\n @analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on backlog\", 1)\n\n @scope.$on \"sprintform:create:success\", =>\n @.loadSprints()\n @.loadProjectStats()\n @analytics.trackEvent(\"sprint\", \"create\", \"create sprint on backlog\", 1)\n\n @scope.$on \"usform:new:success\", =>\n @.loadUserstories()\n @.loadProjectStats()\n\n @rootscope.$broadcast(\"filters:update\")\n @analytics.trackEvent(\"userstory\", \"create\", \"create userstory on backlog\", 1)\n\n @scope.$on \"sprintform:edit:success\", =>\n @.loadProjectStats()\n\n @scope.$on \"sprintform:remove:success\", (event, sprint) =>\n @.loadSprints()\n @.loadProjectStats()\n @.loadUserstories()\n\n if sprint.closed\n @.loadClosedSprints()\n\n @rootscope.$broadcast(\"filters:update\")\n\n @scope.$on \"usform:edit:success\", =>\n @.loadUserstories()\n @rootscope.$broadcast(\"filters:update\")\n\n @scope.$on(\"sprint:us:move\", @.moveUs)\n @scope.$on(\"sprint:us:moved\", @.loadSprints)\n @scope.$on(\"sprint:us:moved\", @.loadProjectStats)\n\n @scope.$on(\"backlog:load-closed-sprints\", @.loadClosedSprints)\n @scope.$on(\"backlog:unload-closed-sprints\", @.unloadClosedSprints)\n\n initializeSubscription: ->\n routingKey1 = \"changes.project.#{@scope.projectId}.userstories\"\n @events.subscribe @scope, routingKey1, (message) =>\n @.loadUserstories()\n @.loadSprints()\n\n routingKey2 = \"changes.project.#{@scope.projectId}.milestones\"\n @events.subscribe @scope, routingKey2, (message) =>\n @.loadSprints()\n\n toggleShowTags: ->\n @scope.$apply =>\n @showTags = !@showTags\n @rs.userstories.storeShowTags(@scope.projectId, @showTags)\n\n toggleActiveFilters: ->\n @activeFilters = !@activeFilters\n\n loadProjectStats: ->\n return @rs.projects.stats(@scope.projectId).then (stats) =>\n @scope.stats = stats\n totalPoints = if stats.total_points then stats.total_points else stats.defined_points\n\n if totalPoints\n @scope.stats.completedPercentage = Math.round(100 * stats.closed_points / totalPoints)\n else\n @scope.stats.completedPercentage = 0\n\n @scope.showGraphPlaceholder = !(stats.total_points? && stats.total_milestones?)\n return stats\n\n unloadClosedSprints: ->\n @scope.$apply =>\n @scope.closedSprints = []\n @rootscope.$broadcast(\"closed-sprints:reloaded\", [])\n\n loadClosedSprints: ->\n params = {closed: true}\n return @rs.sprints.list(@scope.projectId, params).then (result) =>\n sprints = result.milestones\n\n @scope.totalClosedMilestones = result.closed\n\n # NOTE: Fix order of USs because the filter orderBy does not work propertly in partials files\n for sprint in sprints\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\")\n @scope.closedSprints = sprints\n @scope.closedSprintsById = groupBy(sprints, (x) -> x.id)\n @rootscope.$broadcast(\"closed-sprints:reloaded\", sprints)\n return sprints\n\n loadSprints: ->\n params = {closed: false}\n return @rs.sprints.list(@scope.projectId, params).then (result) =>\n sprints = result.milestones\n\n @scope.totalMilestones = sprints\n @scope.totalClosedMilestones = result.closed\n @scope.totalOpenMilestones = result.open\n @scope.totalMilestones = @scope.totalOpenMilestones + @scope.totalClosedMilestones\n\n # NOTE: Fix order of USs because the filter orderBy does not work propertly in partials files\n for sprint in sprints\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\")\n\n @scope.sprints = sprints\n @scope.openSprints = _.filter(sprints, (sprint) => not sprint.closed).reverse()\n @scope.closedSprints = [] if !@scope.closedSprints\n\n @scope.sprintsCounter = sprints.length\n @scope.sprintsById = groupBy(sprints, (x) -> x.id)\n @rootscope.$broadcast(\"sprints:loaded\", sprints)\n return sprints\n\n resetFilters: ->\n selectedTags = _.filter(@scope.filters.tags, \"selected\")\n selectedStatuses = _.filter(@scope.filters.status, \"selected\")\n\n @scope.filtersQ = \"\"\n\n _.each [selectedTags, selectedStatuses], (filterGrp) =>\n _.each filterGrp, (item) =>\n filters = @scope.filters[item.type]\n filter = _.find(filters, {id: taiga.toString(item.id)})\n filter.selected = false\n\n @.unselectFilter(item.type, item.id)\n\n @.loadUserstories()\n @rootscope.$broadcast(\"filters:update\")\n\n loadUserstories: ->\n @scope.httpParams = @.getUrlFilters()\n @rs.userstories.storeQueryParams(@scope.projectId, @scope.httpParams)\n\n promise = @rs.userstories.listUnassigned(@scope.projectId, @scope.httpParams)\n\n return promise.then (userstories) =>\n # NOTE: Fix order of USs because the filter orderBy does not work propertly in the partials files\n @scope.userstories = _.sortBy(userstories, \"backlog_order\")\n\n @.setSearchDataFilters()\n\n # The broadcast must be executed when the DOM has been fully reloaded.\n # We can't assure when this exactly happens so we need a defer\n scopeDefer @scope, =>\n @scope.$broadcast(\"userstories:loaded\")\n\n return userstories\n\n loadBacklog: ->\n return @q.all([\n @.loadProjectStats(),\n @.loadSprints(),\n @.loadUserstories()\n ])\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.is_backlog_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.closedMilestones = !!project.total_closed_milestones\n @scope.$emit('project:loaded', project)\n @scope.points = _.sortBy(project.points, \"order\")\n @scope.pointsById = groupBy(project.points, (x) -> x.id)\n @scope.usStatusById = groupBy(project.us_statuses, (x) -> x.id)\n @scope.usStatusList = _.sortBy(project.us_statuses, \"id\")\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.initializeSubscription()\n\n return promise\n .then(=> @.loadBacklog())\n .then(=> @.generateFilters())\n .then(=> @scope.$emit(\"backlog:loaded\"))\n\n prepareBulkUpdateData: (uses, field=\"backlog_order\") ->\n return _.map(uses, (x) -> {\"us_id\": x.id, \"order\": x[field]})\n\n resortUserStories: (uses, field=\"backlog_order\") ->\n items = []\n\n for item, index in uses\n item[field] = index\n if item.isModified()\n items.push(item)\n\n return items\n\n moveUs: (ctx, usList, newUsIndex, newSprintId) ->\n oldSprintId = usList[0].milestone\n project = usList[0].project\n\n movedFromClosedSprint = false\n movedToClosedSprint = false\n\n sprint = @scope.sprintsById[oldSprintId]\n\n # Move from closed sprint\n if !sprint && @scope.closedSprintsById\n sprint = @scope.closedSprintsById[oldSprintId]\n movedFromClosedSprint = true if sprint\n\n newSprint = @scope.sprintsById[newSprintId]\n\n # Move to closed sprint\n if !newSprint && newSprintId\n newSprint = @scope.closedSprintsById[newSprintId]\n movedToClosedSprint = true if newSprint\n\n # In the same sprint or in the backlog\n if newSprintId == oldSprintId\n items = null\n userstories = null\n\n if newSprintId == null\n userstories = @scope.userstories\n else\n userstories = newSprint.user_stories\n\n @scope.$apply ->\n for us, key in usList\n r = userstories.indexOf(us)\n userstories.splice(r, 1)\n\n args = [newUsIndex, 0].concat(usList)\n Array.prototype.splice.apply(userstories, args)\n\n # If in backlog\n if newSprintId == null\n # Rehash userstories order field\n\n items = @.resortUserStories(userstories, \"backlog_order\")\n data = @.prepareBulkUpdateData(items, \"backlog_order\")\n\n # Persist in bulk all affected\n # userstories with order change\n @rs.userstories.bulkUpdateBacklogOrder(project, data).then =>\n for us in usList\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n # For sprint\n else\n # Rehash userstories order field\n items = @.resortUserStories(userstories, \"sprint_order\")\n data = @.prepareBulkUpdateData(items, \"sprint_order\")\n\n # Persist in bulk all affected\n # userstories with order change\n @rs.userstories.bulkUpdateSprintOrder(project, data).then =>\n for us in usList\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n return promise\n\n # From sprint to backlog\n if newSprintId == null\n us.milestone = null for us in usList\n\n @scope.$apply =>\n # Add new us to backlog userstories list\n # @scope.userstories.splice(newUsIndex, 0, us)\n args = [newUsIndex, 0].concat(usList)\n Array.prototype.splice.apply(@scope.userstories, args)\n\n for us, key in usList\n r = sprint.user_stories.indexOf(us)\n sprint.user_stories.splice(r, 1)\n\n # Persist the milestone change of userstory\n promise = @repo.save(us)\n\n # Rehash userstories order field\n # and persist in bulk all changes.\n promise = promise.then =>\n items = @.resortUserStories(@scope.userstories, \"backlog_order\")\n data = @.prepareBulkUpdateData(items, \"backlog_order\")\n return @rs.userstories.bulkUpdateBacklogOrder(us.project, data).then =>\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n if movedFromClosedSprint\n @rootscope.$broadcast(\"backlog:load-closed-sprints\")\n\n promise.then null, ->\n console.log \"FAIL\" # TODO\n\n return promise\n\n # From backlog to sprint\n if oldSprintId == null\n us.milestone = newSprintId for us in usList\n\n @scope.$apply =>\n args = [newUsIndex, 0].concat(usList)\n\n # Add moving us to sprint user stories list\n Array.prototype.splice.apply(newSprint.user_stories, args)\n\n # Remove moving us from backlog userstories lists.\n for us, key in usList\n r = @scope.userstories.indexOf(us)\n @scope.userstories.splice(r, 1)\n\n # From sprint to sprint\n else\n us.milestone = newSprintId for us in usList\n\n @scope.$apply =>\n args = [newUsIndex, 0].concat(usList)\n\n # Add new us to backlog userstories list\n Array.prototype.splice.apply(newSprint.user_stories, args)\n\n # Remove the us from the sprint list.\n for us in usList\n r = sprint.user_stories.indexOf(us)\n sprint.user_stories.splice(r, 1)\n\n # Persist the milestone change of userstory\n promises = _.map usList, (us) => @repo.save(us)\n\n # Rehash userstories order field\n # and persist in bulk all changes.\n promise = @q.all(promises).then =>\n items = @.resortUserStories(newSprint.user_stories, \"sprint_order\")\n data = @.prepareBulkUpdateData(items, \"sprint_order\")\n\n @rs.userstories.bulkUpdateSprintOrder(project, data).then (result) =>\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n @rs.userstories.bulkUpdateBacklogOrder(project, data).then =>\n for us in usList\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n if movedToClosedSprint || movedFromClosedSprint\n @scope.$broadcast(\"backlog:load-closed-sprints\")\n\n promise.then null, ->\n console.log \"FAIL\" # TODO\n\n return promise\n\n isFilterSelected: (type, id) ->\n if @searchdata[type]? and @searchdata[type][id]\n return true\n return false\n\n setSearchDataFilters: () ->\n urlfilters = @.getUrlFilters()\n\n if urlfilters.q\n @scope.filtersQ = @scope.filtersQ or urlfilters.q\n\n @searchdata = {}\n for name, value of urlfilters\n if not @searchdata[name]?\n @searchdata[name] = {}\n\n for val in taiga.toString(value).split(\",\")\n @searchdata[name][val] = true\n\n getUrlFilters: ->\n return _.pick(@location.search(), \"status\", \"tags\", \"q\")\n\n generateFilters: ->\n urlfilters = @.getUrlFilters()\n @scope.filters = {}\n\n loadFilters = {}\n loadFilters.project = @scope.projectId\n loadFilters.tags = urlfilters.tags\n loadFilters.status = urlfilters.status\n loadFilters.q = urlfilters.q\n loadFilters.milestone = 'null'\n\n return @rs.userstories.filtersData(loadFilters).then (data) =>\n choicesFiltersFormat = (choices, type, byIdObject) =>\n _.map choices, (t) ->\n t.type = type\n return t\n\n tagsFilterFormat = (tags) =>\n return _.map tags, (t) ->\n t.id = t.name\n t.type = 'tags'\n return t\n\n # Build filters data structure\n @scope.filters.status = choicesFiltersFormat(data.statuses, \"status\", @scope.usStatusById)\n @scope.filters.tags = tagsFilterFormat(data.tags)\n\n selectedTags = _.filter(@scope.filters.tags, \"selected\")\n selectedTags = _.map(selectedTags, \"id\")\n\n selectedStatuses = _.filter(@scope.filters.status, \"selected\")\n selectedStatuses = _.map(selectedStatuses, \"id\")\n\n @.markSelectedFilters(@scope.filters, urlfilters)\n\n #store query params\n @rs.userstories.storeQueryParams(@scope.projectId, {\n \"status\": selectedStatuses,\n \"tags\": selectedTags,\n \"project\": @scope.projectId\n \"milestone\": null\n })\n\n markSelectedFilters: (filters, urlfilters) ->\n # Build selected filters (from url) fast lookup data structure\n searchdata = {}\n for name, value of _.omit(urlfilters, \"page\", \"orderBy\")\n if not searchdata[name]?\n searchdata[name] = {}\n\n for val in \"#{value}\".split(\",\")\n searchdata[name][val] = true\n\n isSelected = (type, id) ->\n if searchdata[type]? and searchdata[type][id]\n return true\n return false\n\n for key, value of filters\n for obj in value\n obj.selected = if isSelected(obj.type, obj.id) then true else undefined\n\n ## Template actions\n\n updateUserStoryStatus: () ->\n @.setSearchDataFilters()\n @.generateFilters().then () =>\n @rootscope.$broadcast(\"filters:update\")\n @.loadProjectStats()\n\n editUserStory: (projectId, ref, $event) ->\n target = $($event.target)\n\n currentLoading = @loading()\n .target(target)\n .removeClasses(\"icon-edit\")\n .timeout(200)\n .start()\n\n @rs.userstories.getByRef(projectId, ref).then (us) =>\n @rootscope.$broadcast(\"usform:edit\", us)\n\n currentLoading.finish()\n\n deleteUserStory: (us) ->\n title = @translate.instant(\"US.TITLE_DELETE_ACTION\")\n\n message = us.subject\n\n @confirm.askOnDelete(title, message).then (askResponse) =>\n # We modify the userstories in scope so the user doesn't see the removed US for a while\n @scope.userstories = _.without(@scope.userstories, us)\n promise = @.repo.remove(us)\n promise.then =>\n askResponse.finish()\n @.loadBacklog()\n promise.then null, =>\n askResponse.finish(false)\n @confirm.notify(\"error\")\n\n addNewUs: (type) ->\n switch type\n when \"standard\" then @rootscope.$broadcast(\"usform:new\", @scope.projectId,\n @scope.project.default_us_status, @scope.usStatusList)\n when \"bulk\" then @rootscope.$broadcast(\"usform:bulk\", @scope.projectId,\n @scope.project.default_us_status)\n\n addNewSprint: () ->\n @rootscope.$broadcast(\"sprintform:create\", @scope.projectId)\n\nmodule.controller(\"BacklogController\", BacklogController)\n\n#############################################################################\n## Backlog Directive\n#############################################################################\n\nBacklogDirective = ($repo, $rootscope, $translate) ->\n ## Doom line Link\n doomLineTemplate = _.template(\"\"\"\n
<%- text %>
\n \"\"\")\n\n linkDoomLine = ($scope, $el, $attrs, $ctrl) ->\n reloadDoomLine = ->\n if $scope.stats? and $scope.stats.total_points? and $scope.stats.total_points != 0\n removeDoomlineDom()\n\n stats = $scope.stats\n\n total_points = stats.total_points\n current_sum = stats.assigned_points\n\n return if not $scope.userstories\n\n for us, i in $scope.userstories\n current_sum += us.total_points\n\n if current_sum > total_points\n domElement = $el.find('.backlog-table-body .us-item-row')[i]\n addDoomLineDom(domElement)\n\n break\n\n removeDoomlineDom = ->\n $el.find(\".doom-line\").remove()\n\n addDoomLineDom = (element) ->\n text = $translate.instant(\"BACKLOG.DOOMLINE\")\n $(element).before(doomLineTemplate({\"text\": text}))\n\n getUsItems = ->\n rowElements = $el.find('.backlog-table-body .us-item-row')\n return _.map(rowElements, (x) -> angular.element(x))\n\n $scope.$on(\"userstories:loaded\", reloadDoomLine)\n $scope.$watch \"stats\", reloadDoomLine\n\n ## Move to current sprint link\n\n linkToolbar = ($scope, $el, $attrs, $ctrl) ->\n moveToCurrentSprint = (selectedUss) ->\n ussCurrent = _($scope.userstories)\n\n # Remove them from backlog\n $scope.userstories = ussCurrent.without.apply(ussCurrent, selectedUss).value()\n\n extraPoints = _.map(selectedUss, (v, k) -> v.total_points)\n totalExtraPoints = _.reduce(extraPoints, (acc, num) -> acc + num)\n\n # Add them to current sprint\n $scope.sprints[0].user_stories = _.union($scope.sprints[0].user_stories, selectedUss)\n\n # Update the total of points\n $scope.sprints[0].total_points += totalExtraPoints\n\n $repo.saveAll(selectedUss).then ->\n $ctrl.loadSprints()\n $ctrl.loadProjectStats()\n\n\n shiftPressed = false\n lastChecked = null\n\n checkSelected = (target) ->\n lastChecked = target.closest(\".us-item-row\")\n moveToCurrentSprintDom = $el.find(\"#move-to-current-sprint\")\n selectedUsDom = $el.find(\".backlog-table-body input:checkbox:checked\")\n\n if selectedUsDom.length > 0 and $scope.sprints.length > 0\n moveToCurrentSprintDom.show()\n else\n moveToCurrentSprintDom.hide()\n\n target.closest('.us-item-row').toggleClass('ui-multisortable-multiple')\n\n $(window).on \"keydown.shift-pressed keyup.shift-pressed\", (event) ->\n shiftPressed = !!event.shiftKey\n\n return true\n\n # Enable move to current sprint only when there are selected us's\n $el.on \"change\", \".backlog-table-body input:checkbox\", (event) ->\n # check elements between the last two if shift is pressed\n if lastChecked && shiftPressed\n elements = []\n current = $(event.currentTarget).closest(\".us-item-row\")\n nextAll = lastChecked.nextAll()\n prevAll = lastChecked.prevAll()\n\n if _.some(nextAll, (next) -> next == current[0])\n elements = lastChecked.nextUntil(current)\n else if _.some(prevAll, (prev) -> prev == current[0])\n elements = lastChecked.prevUntil(current)\n\n _.map elements, (elm) ->\n input = $(elm).find(\"input:checkbox\")\n input.prop('checked', true)\n checkSelected(input)\n\n target = angular.element(event.currentTarget)\n target.closest(\".us-item-row\").toggleClass('is-checked')\n checkSelected(target)\n\n $el.on \"click\", \"#move-to-current-sprint\", (event) =>\n # Calculating the us's to be modified\n ussDom = $el.find(\".backlog-table-body input:checkbox:checked\")\n\n ussToMove = _.map ussDom, (item) ->\n item = $(item).closest('.tg-scope')\n itemScope = item.scope()\n itemScope.us.milestone = $scope.sprints[0].id\n return itemScope.us\n\n $scope.$apply(_.partial(moveToCurrentSprint, ussToMove))\n\n $el.on \"click\", \"#show-tags\", (event) ->\n event.preventDefault()\n\n $ctrl.toggleShowTags()\n\n showHideTags($ctrl)\n\n showHideTags = ($ctrl) ->\n elm = angular.element(\"#show-tags\")\n\n if $ctrl.showTags\n elm.addClass(\"active\")\n\n text = $translate.instant(\"BACKLOG.TAGS.HIDE\")\n elm.text(text)\n else\n elm.removeClass(\"active\")\n\n text = $translate.instant(\"BACKLOG.TAGS.SHOW\")\n elm.text(text)\n\n showHideFilter = ($scope, $el, $ctrl) ->\n sidebar = $el.find(\"sidebar.filters-bar\")\n sidebar.one \"transitionend\", () ->\n timeout 150, ->\n $rootscope.$broadcast(\"resize\")\n $('.burndown').css(\"visibility\", \"visible\")\n\n target = angular.element(\"#show-filters-button\")\n $('.burndown').css(\"visibility\", \"hidden\")\n sidebar.toggleClass(\"active\")\n target.toggleClass(\"active\")\n\n hideText = $translate.instant(\"BACKLOG.FILTERS.HIDE\")\n showText = $translate.instant(\"BACKLOG.FILTERS.SHOW\")\n\n toggleText(target.find(\".text\"), [hideText, showText])\n\n if !sidebar.hasClass(\"active\")\n $ctrl.resetFilters()\n\n $ctrl.toggleActiveFilters()\n\n ## Filters Link\n\n linkFilters = ($scope, $el, $attrs, $ctrl) ->\n $scope.filtersSearch = {}\n $el.on \"click\", \"#show-filters-button\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n showHideFilter($scope, $el, $ctrl)\n\n link = ($scope, $el, $attrs, $rootscope) ->\n $ctrl = $el.controller()\n\n linkToolbar($scope, $el, $attrs, $ctrl)\n linkFilters($scope, $el, $attrs, $ctrl)\n linkDoomLine($scope, $el, $attrs, $ctrl)\n\n $el.find(\".backlog-table-body\").disableSelection()\n\n filters = $ctrl.getUrlFilters()\n if filters.status ||\n filters.tags ||\n filters.q\n showHideFilter($scope, $el, $ctrl)\n\n $scope.$on \"showTags\", () ->\n showHideTags($ctrl)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n $(window).off(\".shift-pressed\")\n\n return {link: link}\n\n\nmodule.directive(\"tgBacklog\", [\"$tgRepo\", \"$rootScope\", \"$translate\", BacklogDirective])\n\n#############################################################################\n## User story points directive\n#############################################################################\n\nUsRolePointsSelectorDirective = ($rootscope, $template, $compile, $translate) ->\n selectionTemplate = $template.get(\"backlog/us-role-points-popover.html\", true)\n\n link = ($scope, $el, $attrs) ->\n # Watchers\n bindOnce $scope, \"project\", (project) ->\n roles = _.filter(project.roles, \"computable\")\n numberOfRoles = _.size(roles)\n\n if numberOfRoles > 1\n $el.append($compile(selectionTemplate({\"roles\": roles}))($scope))\n else\n $el.find(\".icon-arrow-bottom\").remove()\n $el.find(\".header-points\").addClass(\"not-clickable\")\n\n $scope.$on \"uspoints:select\", (ctx, roleId, roleName) ->\n $el.find(\".popover\").popover().close()\n $el.find(\".header-points\").html(\"#{roleName}/Total\")\n\n $scope.$on \"uspoints:clear-selection\", (ctx, roleId) ->\n $el.find(\".popover\").popover().close()\n\n text = $translate.instant(\"COMMON.FIELDS.POINTS\")\n $el.find(\".header-points\").text(text)\n\n # Dom Event Handlers\n $el.on \"click\", (event) ->\n target = angular.element(event.target)\n\n if target.is(\"span\") or target.is(\"div\")\n event.stopPropagation()\n\n $el.find(\".popover\").popover().open()\n\n $el.on \"click\", \".clear-selection\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n $rootscope.$broadcast(\"uspoints:clear-selection\")\n\n $el.on \"click\", \".role\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n rolScope = target.scope()\n $rootscope.$broadcast(\"uspoints:select\", target.data(\"role-id\"), target.text())\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgUsRolePointsSelector\", [\"$rootScope\", \"$tgTemplate\", \"$compile\", UsRolePointsSelectorDirective])\n\n\nUsPointsDirective = ($tgEstimationsService, $repo, $tgTemplate) ->\n rolesTemplate = $tgTemplate.get(\"common/estimation/us-points-roles-popover.html\", true)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n updatingSelectedRoleId = null\n selectedRoleId = null\n filteringRoleId = null\n estimationProcess = null\n\n $scope.$on \"uspoints:select\", (ctx, roleId, roleName) ->\n us = $scope.$eval($attrs.tgBacklogUsPoints)\n selectedRoleId = roleId\n estimationProcess.render()\n\n $scope.$on \"uspoints:clear-selection\", (ctx) ->\n us = $scope.$eval($attrs.tgBacklogUsPoints)\n selectedRoleId = null\n estimationProcess.render()\n\n $scope.$watch $attrs.tgBacklogUsPoints, (us) ->\n if us\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project)\n\n # Update roles\n roles = estimationProcess.calculateRoles()\n if roles.length == 0\n $el.find(\".icon-arrow-bottom\").remove()\n $el.find(\"a.us-points\").addClass(\"not-clickable\")\n\n else if roles.length == 1\n # Preselect the role if we have only one\n selectedRoleId = _.keys(us.points)[0]\n\n if estimationProcess.isEditable\n bindClickElements()\n\n estimationProcess.onSelectedPointForRole = (roleId, pointId) ->\n @save(roleId, pointId).then ->\n $ctrl.loadProjectStats()\n\n estimationProcess.render = () ->\n totalPoints = @calculateTotalPoints()\n if not selectedRoleId? or roles.length == 1\n text = totalPoints\n title = totalPoints\n else\n pointId = @us.points[selectedRoleId]\n pointObj = @pointsById[pointId]\n text = \"#{pointObj.name} / #{totalPoints}\"\n title = \"#{pointObj.name} / #{totalPoints}\"\n\n ctx = {\n totalPoints: totalPoints\n roles: @calculateRoles()\n editable: @isEditable\n text: text\n title: title\n }\n mainTemplate = \"common/estimation/us-estimation-total.html\"\n template = $tgTemplate.get(mainTemplate, true)\n html = template(ctx)\n @$el.html(html)\n\n estimationProcess.render()\n\n renderRolesSelector = () ->\n roles = estimationProcess.calculateRoles()\n html = rolesTemplate({\"roles\": roles})\n # Render into DOM and show the new created element\n $el.append(html)\n $el.find(\".pop-role\").popover().open(() -> $(this).remove())\n\n bindClickElements = () ->\n $el.on \"click\", \"a.us-points span\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n us = $scope.$eval($attrs.tgBacklogUsPoints)\n updatingSelectedRoleId = selectedRoleId\n if selectedRoleId?\n estimationProcess.renderPointsSelector(selectedRoleId)\n else\n renderRolesSelector()\n\n $el.on \"click\", \".role\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n us = $scope.$eval($attrs.tgBacklogUsPoints)\n updatingSelectedRoleId = target.data(\"role-id\")\n popRolesDom = $el.find(\".pop-role\")\n popRolesDom.find(\"a\").removeClass(\"active\")\n popRolesDom.find(\"a[data-role-id='#{updatingSelectedRoleId}']\").addClass(\"active\")\n estimationProcess.renderPointsSelector(updatingSelectedRoleId)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgBacklogUsPoints\", [\"$tgEstimationsService\", \"$tgRepo\", \"$tgTemplate\", UsPointsDirective])\n\n\n#############################################################################\n## Burndown graph directive\n#############################################################################\nToggleBurndownVisibility = ($storage) ->\n hide = () ->\n $(\".js-burndown-graph\").removeClass(\"shown\")\n $(\".js-toggle-burndown-visibility-button\").removeClass(\"active\")\n $(\".js-burndown-graph\").removeClass(\"open\")\n\n show = (firstLoad) ->\n $(\".js-toggle-burndown-visibility-button\").addClass(\"active\")\n\n if firstLoad\n $(\".js-burndown-graph\").addClass(\"shown\")\n else\n $(\".js-burndown-graph\").addClass(\"open\")\n\n link = ($scope, $el, $attrs) ->\n firstLoad = true\n hash = generateHash([\"is-burndown-grpahs-collapsed\"])\n $scope.isBurndownGraphCollapsed = $storage.get(hash) or false\n\n toggleGraph = ->\n if $scope.isBurndownGraphCollapsed\n hide(firstLoad)\n else\n show(firstLoad)\n\n firstLoad = false\n\n $scope.$watch \"showGraphPlaceholder\", () ->\n if $scope.showGraphPlaceholder?\n $scope.isBurndownGraphCollapsed = $scope.isBurndownGraphCollapsed || $scope.showGraphPlaceholder\n toggleGraph()\n\n $el.on \"click\", \".js-toggle-burndown-visibility-button\", ->\n $scope.isBurndownGraphCollapsed = !$scope.isBurndownGraphCollapsed\n $storage.set(hash, $scope.isBurndownGraphCollapsed)\n toggleGraph()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n }\n\nmodule.directive(\"tgToggleBurndownVisibility\", [\"$tgStorage\", ToggleBurndownVisibility])\n\n\n#############################################################################\n## Burndown graph directive\n#############################################################################\n\nBurndownBacklogGraphDirective = ($translate) ->\n redrawChart = (element, dataToDraw) ->\n width = element.width()\n element.height(width/6)\n milestonesRange = [0..(dataToDraw.milestones.length - 1)]\n data = []\n zero_line = _.map(dataToDraw.milestones, (ml) -> 0)\n data.push({\n data: _.zip(milestonesRange, zero_line)\n lines:\n fillColor : \"rgba(0,0,0,0)\"\n points:\n show: false\n })\n optimal_line = _.map(dataToDraw.milestones, (ml) -> ml.optimal)\n data.push({\n data: _.zip(milestonesRange, optimal_line)\n lines:\n fillColor : \"rgba(120,120,120,0.2)\"\n })\n evolution_line = _.filter(_.map(dataToDraw.milestones, (ml) -> ml.evolution), (evolution) -> evolution?)\n data.push({\n data: _.zip(milestonesRange, evolution_line)\n lines:\n fillColor : \"rgba(102,153,51,0.3)\"\n })\n team_increment_line = _.map(dataToDraw.milestones, (ml) -> -ml[\"team-increment\"])\n data.push({\n data: _.zip(milestonesRange, team_increment_line)\n lines:\n fillColor : \"rgba(153,51,51,0.3)\"\n })\n client_increment_line = _.map dataToDraw.milestones, (ml) ->\n -ml[\"team-increment\"] - ml[\"client-increment\"]\n data.push({\n data: _.zip(milestonesRange, client_increment_line)\n lines:\n fillColor : \"rgba(255,51,51,0.3)\"\n })\n\n colors = [\n \"rgba(0,0,0,1)\"\n \"rgba(120,120,120,0.2)\"\n \"rgba(102,153,51,1)\"\n \"rgba(153,51,51,1)\"\n \"rgba(255,51,51,1)\"\n ]\n\n options = {\n grid: {\n borderWidth: { top: 0, right: 1, left:0, bottom: 0 }\n borderColor: \"#ccc\"\n hoverable: true\n }\n xaxis: {\n ticks: dataToDraw.milestones.length\n axisLabel: $translate.instant(\"BACKLOG.CHART.XAXIS_LABEL\"),\n axisLabelUseCanvas: true\n axisLabelFontSizePixels: 12\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\"\n axisLabelPadding: 5\n tickFormatter: (val, axis) -> \"\"\n }\n yaxis: {\n axisLabel: $translate.instant(\"BACKLOG.CHART.YAXIS_LABEL\"),\n axisLabelUseCanvas: true\n axisLabelFontSizePixels: 12\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\"\n axisLabelPadding: 5\n }\n series: {\n shadowSize: 0\n lines: {\n show: true\n fill: true\n }\n points: {\n show: true\n fill: true\n radius: 4\n lineWidth: 2\n }\n }\n colors: colors\n tooltip: true\n tooltipOpts: {\n content: (label, xval, yval, flotItem) ->\n if flotItem.seriesIndex == 1\n ctx = {sprintName: dataToDraw.milestones[xval].name, value: Math.abs(yval)}\n return $translate.instant(\"BACKLOG.CHART.OPTIMAL\", ctx)\n else if flotItem.seriesIndex == 2\n ctx = {sprintName: dataToDraw.milestones[xval].name, value: Math.abs(yval)}\n return $translate.instant(\"BACKLOG.CHART.REAL\", ctx)\n else if flotItem.seriesIndex == 3\n ctx = {sprintName: dataToDraw.milestones[xval].name, value: Math.abs(yval)}\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_TEAM\", ctx)\n else\n ctx = {sprintName: dataToDraw.milestones[xval].name, value: Math.abs(yval)}\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_CLIENT\", ctx)\n }\n }\n\n element.empty()\n element.plot(data, options).data(\"plot\")\n\n link = ($scope, $el, $attrs) ->\n element = angular.element($el)\n\n $scope.$watch \"stats\", (value) ->\n if $scope.stats?\n redrawChart(element, $scope.stats)\n\n $scope.$on \"resize\", ->\n redrawChart(element, $scope.stats)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgBurndownBacklogGraph\", [\"$translate\", BurndownBacklogGraphDirective])\n\n\n#############################################################################\n## Backlog progress bar directive\n#############################################################################\n\nTgBacklogProgressBarDirective = ($template, $compile) ->\n template = $template.get(\"backlog/progress-bar.html\", true)\n\n render = (scope, el, projectPointsPercentaje, closedPointsPercentaje) ->\n html = template({\n projectPointsPercentaje: projectPointsPercentaje,\n closedPointsPercentaje:closedPointsPercentaje\n })\n html = $compile(html)(scope)\n el.html(html)\n\n adjustPercentaje = (percentage) ->\n adjusted = _.max([0 , percentage])\n adjusted = _.min([100, adjusted])\n return Math.round(adjusted)\n\n link = ($scope, $el, $attrs) ->\n element = angular.element($el)\n\n $scope.$watch $attrs.tgBacklogProgressBar, (stats) ->\n if stats?\n totalPoints = if stats.total_points then stats.total_points else stats.defined_points\n definedPoints = stats.defined_points\n closedPoints = stats.closed_points\n if definedPoints > totalPoints\n projectPointsPercentaje = totalPoints * 100 / definedPoints\n closedPointsPercentaje = closedPoints * 100 / definedPoints\n else\n projectPointsPercentaje = 100\n closedPointsPercentaje = closedPoints * 100 / totalPoints\n\n projectPointsPercentaje = adjustPercentaje(projectPointsPercentaje - 3)\n closedPointsPercentaje = adjustPercentaje(closedPointsPercentaje - 3)\n render($scope, $el, projectPointsPercentaje, closedPointsPercentaje)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgBacklogProgressBar\", [\"$tgTemplate\", \"$compile\", TgBacklogProgressBarDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/sortable.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\n\nmodule = angular.module(\"taigaBacklog\")\n\n\n#############################################################################\n## Sortable Directive\n#############################################################################\n\ndeleteElement = (el) ->\n el.scope().$destroy()\n el.off()\n el.remove()\n\nBacklogSortableDirective = ($repo, $rs, $rootscope, $tgConfirm, $translate) ->\n # Notes about jquery bug:\n # http://stackoverflow.com/questions/5791886/jquery-draggable-shows-\n # helper-in-wrong-place-when-scrolled-down-page\n\n link = ($scope, $el, $attrs) ->\n getUsIndex = (us) =>\n return $(us).index(\".backlog-table-body .row\")\n\n bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions we don't enable the sortable\n if not (project.my_permissions.indexOf(\"modify_us\") > -1)\n return\n\n filterError = ->\n text = $translate.instant(\"BACKLOG.SORTABLE_FILTER_ERROR\")\n $tgConfirm.notify(\"error\", text)\n\n $el.sortable({\n items: \".us-item-row\",\n cancel: \".popover\"\n connectWith: \".sprint\"\n dropOnEmpty: true\n placeholder: \"row us-item-row us-item-drag sortable-placeholder\"\n scroll: true\n disableHorizontalScroll: true\n # A consequence of length of backlog user story item\n # the default tolerance (\"intersection\") not works properly.\n tolerance: \"pointer\"\n # Revert on backlog is disabled bacause it works bad. Something\n # on the current taiga backlog structure or style makes jquery ui\n # works unexpectly (in some circumstances calculates wrong\n # position for revert).\n revert: false\n start: () ->\n $(document.body).addClass(\"drag-active\")\n stop: () ->\n $(document.body).removeClass(\"drag-active\")\n\n if $el.hasClass(\"active-filters\")\n $el.sortable(\"cancel\")\n filterError()\n })\n\n $el.on \"multiplesortreceive\", (event, ui) ->\n if $el.hasClass(\"active-filters\")\n ui.source.sortable(\"cancel\")\n filterError()\n\n return\n\n itemUs = ui.item.scope().us\n itemIndex = getUsIndex(ui.item)\n\n deleteElement(ui.item)\n\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, null)\n ui.item.find('a').removeClass('noclick')\n\n $el.on \"multiplesortstop\", (event, ui) ->\n # When parent not exists, do nothing\n if $(ui.items[0]).parent().length == 0\n return\n\n if $el.hasClass(\"active-filters\")\n return\n\n items = _.sortBy ui.items, (item) ->\n return $(item).index()\n\n index = _.min _.map items, (item) ->\n return getUsIndex(item)\n\n us = _.map items, (item) ->\n item = $(item)\n itemUs = item.scope().us\n\n # HACK: setTimeout prevents that firefox click\n # event fires just after drag ends\n setTimeout ( =>\n item.find('a').removeClass('noclick')\n ), 300\n\n return itemUs\n\n $scope.$emit(\"sprint:us:move\", us, index, null)\n\n $el.on \"sortstart\", (event, ui) ->\n ui.item.find('a').addClass('noclick')\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nBacklogEmptySortableDirective = ($repo, $rs, $rootscope) ->\n # Notes about jquery bug:\n # http://stackoverflow.com/questions/5791886/jquery-draggable-shows-\n # helper-in-wrong-place-when-scrolled-down-page\n\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions we don't enable the sortable\n if project.my_permissions.indexOf(\"modify_us\") > -1\n $el.sortable({\n items: \".us-item-row\",\n dropOnEmpty: true\n })\n\n $el.on \"sortreceive\", (event, ui) ->\n itemUs = ui.item.scope().us\n itemIndex = ui.item.index()\n\n deleteElement(ui.item)\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, null)\n\n ui.item.find('a').removeClass('noclick')\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nSprintSortableDirective = ($repo, $rs, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions we don't enable the sortable\n if project.my_permissions.indexOf(\"modify_us\") > -1\n $el.sortable({\n scroll: true\n dropOnEmpty: true\n items: \".sprint-table .milestone-us-item-row\"\n disableHorizontalScroll: true\n connectWith: \".sprint,.backlog-table-body,.empty-backlog\"\n placeholder: \"row us-item-row sortable-placeholder\"\n forcePlaceholderSize:true\n })\n\n $el.on \"multiplesortreceive\", (event, ui) ->\n items = _.sortBy ui.items, (item) ->\n return $(item).index()\n\n index = _.min _.map items, (item) ->\n return $(item).index()\n\n us = _.map items, (item) ->\n item = $(item)\n itemUs = item.scope().us\n\n deleteElement(item)\n\n return itemUs\n\n $scope.$emit(\"sprint:us:move\", us, index, $scope.sprint.id)\n\n $el.on \"multiplesortstop\", (event, ui) ->\n # When parent not exists, do nothing\n if ui.item.parent().length == 0\n return\n\n itemUs = ui.item.scope().us\n itemIndex = ui.item.index()\n\n # HACK: setTimeout prevents that firefox click\n # event fires just after drag ends\n setTimeout ( =>\n ui.item.find('a').removeClass('noclick')\n ), 300\n\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, $scope.sprint.id)\n\n $el.on \"sortstart\", (event, ui) ->\n ui.item.find('a').addClass('noclick')\n\n return {link:link}\n\n\nmodule.directive(\"tgBacklogSortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n \"$tgConfirm\",\n \"$translate\",\n BacklogSortableDirective\n])\n\nmodule.directive(\"tgBacklogEmptySortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n BacklogEmptySortableDirective\n])\n\nmodule.directive(\"tgSprintSortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n SprintSortableDirective\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/sprints.coffee\n###\n\ntaiga = @.taiga\n\nmodule = angular.module(\"taigaBacklog\")\n\n\n#############################################################################\n## Sprint Actions Directive\n#############################################################################\n\nBacklogSprintDirective = ($repo, $rootscope) ->\n sprintTableMinHeight = 50\n slideOptions = {\n duration: 500,\n easing: 'linear'\n }\n\n toggleSprint = ($el) =>\n sprintTable = $el.find(\".sprint-table\")\n sprintArrow = $el.find(\".icon-arrow-up\")\n\n sprintArrow.toggleClass('active')\n sprintTable.toggleClass('open')\n\n link = ($scope, $el, $attrs) ->\n $scope.$watch $attrs.tgBacklogSprint, (sprint) ->\n sprint = $scope.$eval($attrs.tgBacklogSprint)\n\n if sprint.closed\n $el.addClass(\"sprint-closed\")\n else\n toggleSprint($el)\n\n # Event Handlers\n $el.on \"click\", \".sprint-name > .icon-arrow-up\", (event) ->\n event.preventDefault()\n\n toggleSprint($el)\n\n $el.find(\".sprint-table\").slideToggle(slideOptions)\n\n $el.on \"click\", \".sprint-name > .icon-edit\", (event) ->\n event.preventDefault()\n\n sprint = $scope.$eval($attrs.tgBacklogSprint)\n $rootscope.$broadcast(\"sprintform:edit\", sprint)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgBacklogSprint\", [\"$tgRepo\", \"$rootScope\", BacklogSprintDirective])\n\n\n#############################################################################\n## Sprint Header Directive\n#############################################################################\n\nBacklogSprintHeaderDirective = ($navUrls, $template, $compile, $translate) ->\n template = $template.get(\"backlog/sprint-header.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\")\n\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_milestone\") != -1\n\n isVisible = ->\n return $scope.project.my_permissions.indexOf(\"view_milestones\") != -1\n\n render = (sprint) ->\n taskboardUrl = $navUrls.resolve(\"project-taskboard\",\n {project: $scope.project.slug, sprint: sprint.slug})\n\n start = moment(sprint.estimated_start).format(prettyDate)\n finish = moment(sprint.estimated_finish).format(prettyDate)\n estimatedDateRange = \"#{start}-#{finish}\"\n\n ctx = {\n name: sprint.name\n taskboardUrl: taskboardUrl\n estimatedDateRange: estimatedDateRange\n closedPoints: sprint.closed_points or 0\n totalPoints: sprint.total_points or 0\n isVisible: isVisible()\n isEditable: isEditable()\n }\n\n templateScope = $scope.$new()\n\n _.assign(templateScope, ctx)\n\n compiledTemplate = $compile(template)(templateScope)\n $el.html(compiledTemplate)\n\n $scope.$watch $attrs.ngModel, (sprint) ->\n render(sprint)\n\n $scope.$on \"sprintform:edit:success\", ->\n render($model.$modelValue)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgBacklogSprintHeader\", [\"$tgNavUrls\", \"$tgTemplate\", \"$compile\", \"$translate\"\n BacklogSprintHeaderDirective])\n\n\n#############################################################################\n## Toggle Closed Sprints Directive\n#############################################################################\n\nToggleExcludeClosedSprintsVisualization = ($rootscope, $loading, $translate) ->\n excludeClosedSprints = true\n\n link = ($scope, $el, $attrs) ->\n # insert loading wrapper\n loadingElm = $(\"
\")\n $el.after(loadingElm)\n\n currentLoading = null\n\n # Event Handlers\n $el.on \"click\", (event) ->\n event.preventDefault()\n excludeClosedSprints = not excludeClosedSprints\n\n currentLoading = $loading()\n .target(loadingElm)\n .start()\n\n if excludeClosedSprints\n $rootscope.$broadcast(\"backlog:unload-closed-sprints\")\n else\n $rootscope.$broadcast(\"backlog:load-closed-sprints\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $scope.$on \"closed-sprints:reloaded\", (ctx, sprints) =>\n currentLoading.finish()\n\n if sprints.length > 0\n key = \"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS\"\n else\n key = \"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS\"\n\n text = $translate.instant(key)\n\n $el.find(\".text\").text(text)\n\n return {link: link}\n\nmodule.directive(\"tgBacklogToggleClosedSprintsVisualization\", [\"$rootScope\", \"$tgLoading\", \"$translate\",\n ToggleExcludeClosedSprintsVisualization])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard/charts.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ntimeout = @.taiga.timeout\n\nmodule = angular.module(\"taigaTaskboard\")\n\n#############################################################################\n## Sprint burndown graph directive\n#############################################################################\n\nSprintGraphDirective = ($translate)->\n redrawChart = (element, dataToDraw) ->\n width = element.width()\n element.height(240)\n\n days = _.map(dataToDraw, (x) -> moment(x.day))\n\n data = []\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, (d) -> d.optimal_points))\n lines:\n fillColor : \"rgba(120,120,120,0.2)\"\n })\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, (d) -> d.open_points))\n lines:\n fillColor : \"rgba(102,153,51,0.3)\"\n })\n\n options =\n grid:\n borderWidth: { top: 0, right: 1, left:0, bottom: 0 }\n borderColor: '#ccc'\n hoverable: true\n xaxis:\n tickSize: [1, \"day\"]\n min: days[0]\n max: _.last(days)\n mode: \"time\"\n daysNames: days\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.XAXIS_LABEL\")\n axisLabelUseCanvas: true\n axisLabelFontSizePixels: 12\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif'\n axisLabelPadding: 5\n yaxis:\n min: 0\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.YAXIS_LABEL\")\n axisLabelUseCanvas: true\n axisLabelFontSizePixels: 12\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif'\n axisLabelPadding: 5\n series:\n shadowSize: 0\n lines:\n show: true\n fill: true\n points:\n show: true\n fill: true\n radius: 4\n lineWidth: 2\n colors: [\"rgba(102,153,51,1)\", \"rgba(120,120,120,0.2)\"]\n tooltip: true\n tooltipOpts:\n content: (label, xval, yval, flotItem) ->\n formattedDate = moment(xval).format($translate.instant(\"TASKBOARD.CHARTS.DATE\"))\n roundedValue = Math.round(yval)\n\n if flotItem.seriesIndex == 1\n return $translate.instant(\"TASKBOARD.CHARTS.OPTIMAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n })\n\n else\n return $translate.instant(\"TASKBOARD.CHARTS.REAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n })\n\n element.empty()\n element.plot(data, options).data(\"plot\")\n\n link = ($scope, $el, $attrs) ->\n element = angular.element($el)\n\n $scope.$on \"resize\", ->\n redrawChart(element, $scope.stats.days) if $scope.stats\n\n $scope.$on \"taskboard:graph:toggle-visibility\", ->\n $el.parent().toggleClass('open')\n\n # fix chart overflow\n timeout(100, ->\n redrawChart(element, $scope.stats.days) if $scope.stats\n )\n\n $scope.$watch 'stats', (value) ->\n if not $scope.stats?\n return\n redrawChart(element, $scope.stats.days)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgSprintGraph\", [\"$translate\", SprintGraphDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard/lightboxes.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nCreateEditTaskDirective = ($repo, $model, $rs, $rootscope, $loading, lightboxService, $translate) ->\n link = ($scope, $el, attrs) ->\n $scope.isNew = true\n\n $scope.$on \"taskform:new\", (ctx, sprintId, usId) ->\n $scope.task = {\n project: $scope.projectId\n milestone: sprintId\n user_story: usId\n is_archived: false\n status: $scope.project.default_task_status\n assigned_to: null\n tags: []\n }\n $scope.isNew = true\n\n # Update texts for creation\n create = $translate.instant(\"COMMON.CREATE\")\n $el.find(\".button-green\").html(create)\n\n newTask = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.TITLE\")\n $el.find(\".title\").html(newTask + \" \")\n\n $el.find(\".tag-input\").val(\"\")\n lightboxService.open($el)\n\n $scope.$on \"taskform:edit\", (ctx, task) ->\n $scope.task = task\n $scope.isNew = false\n\n # Update texts for edition\n save = $translate.instant(\"COMMON.SAVE\")\n edit = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.ACTION_EDIT\")\n\n $el.find(\".button-green\").html(save)\n $el.find(\".title\").html(edit + \" \")\n\n $el.find(\".tag-input\").val(\"\")\n lightboxService.open($el)\n\n\n submitButton = $el.find(\".submit-button\")\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n if $scope.isNew\n promise = $repo.create(\"tasks\", $scope.task)\n broadcastEvent = \"taskform:new:success\"\n else\n promise = $repo.save($scope.task)\n broadcastEvent = \"taskform:edit:success\"\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n # FIXME: error handling?\n promise.then (data) ->\n currentLoading.finish()\n lightboxService.close($el)\n $rootscope.$broadcast(broadcastEvent, data)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nCreateBulkTasksDirective = ($repo, $rs, $rootscope, $loading, lightboxService) ->\n link = ($scope, $el, attrs) ->\n $scope.form = {data: \"\", usId: null}\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n data = $scope.form.data\n projectId = $scope.projectId\n sprintId = $scope.form.sprintId\n usId = $scope.form.usId\n\n promise = $rs.tasks.bulkCreate(projectId, sprintId, usId, data)\n promise.then (result) ->\n currentLoading.finish()\n $rootscope.$broadcast(\"taskform:bulk:success\", result)\n lightboxService.close($el)\n\n # TODO: error handling\n promise.then null, ->\n currentLoading.finish()\n console.log \"FAIL\"\n\n $scope.$on \"taskform:bulk\", (ctx, sprintId, usId)->\n lightboxService.open($el)\n $scope.form = {data: \"\", sprintId: sprintId, usId: usId}\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule = angular.module(\"taigaTaskboard\")\n\nmodule.directive(\"tgLbCreateEditTask\", [\n \"$tgRepo\",\n \"$tgModel\",\n \"$tgResources\",\n \"$rootScope\",\n \"$tgLoading\",\n \"lightboxService\",\n \"$translate\"\n CreateEditTaskDirective\n])\n\nmodule.directive(\"tgLbCreateBulkTasks\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n \"$tgLoading\",\n \"lightboxService\",\n CreateBulkTasksDirective\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard.coffee\n###\n\ntaiga = @.taiga\ntoggleText = @.taiga.toggleText\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nscopeDefer = @.taiga.scopeDefer\ntimeout = @.taiga.timeout\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaTaskboard\")\n\n\n#############################################################################\n## Taskboard Controller\n#############################################################################\n\nclass TaskboardController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"tgAppMetaService\",\n \"$tgLocation\",\n \"$tgNavUrls\"\n \"$tgEvents\"\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @appMetaService, @location, @navUrls,\n @events, @analytics, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"TASKBOARD.SECTION_NAME\")\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then => @._setMeta()\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n prettyDate = @translate.instant(\"BACKLOG.SPRINTS.DATE\")\n\n title = @translate.instant(\"TASKBOARD.PAGE_TITLE\", {\n projectName: @scope.project.name\n sprintName: @scope.sprint.name\n })\n description = @translate.instant(\"TASKBOARD.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name\n sprintName: @scope.sprint.name\n startDate: moment(@scope.sprint.estimated_start).format(prettyDate)\n endDate: moment(@scope.sprint.estimated_finish).format(prettyDate)\n completedPercentage: @scope.stats.completedPercentage or \"0\"\n completedPoints: @scope.stats.completedPointsSum or \"--\"\n totalPoints: @scope.stats.totalPointsSum or \"--\"\n openTasks: @scope.stats.openTasks or \"--\"\n totalTasks: @scope.stats.total_tasks or \"--\"\n })\n\n @appMetaService.setAll(title, description)\n\n initializeEventHandlers: ->\n # TODO: Reload entire taskboard after create/edit tasks seems\n # a big overhead. It should be optimized in near future.\n @scope.$on \"taskform:bulk:success\", =>\n @.loadTaskboard()\n @analytics.trackEvent(\"task\", \"create\", \"bulk create task on taskboard\", 1)\n\n @scope.$on \"taskform:new:success\", =>\n @.loadTaskboard()\n @analytics.trackEvent(\"task\", \"create\", \"create task on taskboard\", 1)\n\n @scope.$on(\"taskform:edit:success\", => @.loadTaskboard())\n @scope.$on(\"taskboard:task:move\", @.taskMove)\n\n @scope.$on \"assigned-to:added\", (ctx, userId, task) =>\n task.assigned_to = userId\n promise = @repo.save(task)\n promise.then null, ->\n console.log \"FAIL\" # TODO\n\n initializeSubscription: ->\n routingKey = \"changes.project.#{@scope.projectId}.tasks\"\n @events.subscribe @scope, routingKey, (message) =>\n @.loadTaskboard()\n\n routingKey1 = \"changes.project.#{@scope.projectId}.userstories\"\n @events.subscribe @scope, routingKey1, (message) =>\n @.refreshTagsColors()\n @.loadSprintStats()\n @.loadSprint()\n\n loadProject: ->\n return @rs.projects.get(@scope.projectId).then (project) =>\n if not project.is_backlog_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.project = project\n # Not used at this momment\n @scope.pointsList = _.sortBy(project.points, \"order\")\n # @scope.roleList = _.sortBy(project.roles, \"order\")\n @scope.pointsById = groupBy(project.points, (e) -> e.id)\n @scope.roleById = groupBy(project.roles, (e) -> e.id)\n @scope.taskStatusList = _.sortBy(project.task_statuses, \"order\")\n @scope.usStatusList = _.sortBy(project.us_statuses, \"order\")\n @scope.usStatusById = groupBy(project.us_statuses, (e) -> e.id)\n\n @scope.$emit('project:loaded', project)\n\n @.fillUsersAndRoles(project.members, project.roles)\n\n return project\n\n loadSprintStats: ->\n return @rs.sprints.stats(@scope.projectId, @scope.sprintId).then (stats) =>\n totalPointsSum =_.reduce(_.values(stats.total_points), ((res, n) -> res + n), 0)\n completedPointsSum = _.reduce(_.values(stats.completed_points), ((res, n) -> res + n), 0)\n remainingPointsSum = totalPointsSum - completedPointsSum\n remainingTasks = stats.total_tasks - stats.completed_tasks\n @scope.stats = stats\n @scope.stats.totalPointsSum = totalPointsSum\n @scope.stats.completedPointsSum = completedPointsSum\n @scope.stats.remainingPointsSum = remainingPointsSum\n @scope.stats.remainingTasks = remainingTasks\n if stats.totalPointsSum\n @scope.stats.completedPercentage = Math.round(100*stats.completedPointsSum/stats.totalPointsSum)\n else\n @scope.stats.completedPercentage = 0\n\n @scope.stats.openTasks = stats.total_tasks - stats.completed_tasks\n return stats\n\n refreshTagsColors: ->\n return @rs.projects.tagsColors(@scope.projectId).then (tags_colors) =>\n @scope.project.tags_colors = tags_colors\n\n loadSprint: ->\n return @rs.sprints.get(@scope.projectId, @scope.sprintId).then (sprint) =>\n @scope.sprint = sprint\n @scope.userstories = _.sortBy(sprint.user_stories, \"sprint_order\")\n return sprint\n\n loadTasks: ->\n return @rs.tasks.list(@scope.projectId, @scope.sprintId).then (tasks) =>\n @scope.tasks = _.sortBy(tasks, 'taskboard_order')\n @scope.usTasks = {}\n\n # Iterate over all userstories and\n # null userstory for unassigned tasks\n for us in _.union(@scope.userstories, [{id:null}])\n @scope.usTasks[us.id] = {}\n for status in @scope.taskStatusList\n @scope.usTasks[us.id][status.id] = []\n\n for task in @scope.tasks\n if @scope.usTasks[task.user_story]? and @scope.usTasks[task.user_story][task.status]?\n @scope.usTasks[task.user_story][task.status].push(task)\n\n if tasks.length == 0\n \n if @scope.userstories.length > 0\n usId = @scope.userstories[0].id\n else\n usId = null\n\n @scope.usTasks[usId][@scope.taskStatusList[0].id].push({isPlaceholder: true})\n\n return tasks\n\n loadTaskboard: ->\n return @q.all([\n @.refreshTagsColors(),\n @.loadSprintStats(),\n @.loadSprint().then(=> @.loadTasks())\n ])\n\n loadInitialData: ->\n params = {\n pslug: @params.pslug\n sslug: @params.sslug\n }\n\n promise = @repo.resolve(params).then (data) =>\n @scope.projectId = data.project\n @scope.sprintId = data.milestone\n @.initializeSubscription()\n return data\n\n return promise.then(=> @.loadProject())\n .then(=> @.loadTaskboard())\n\n refreshTasksOrder: (tasks) ->\n items = @.resortTasks(tasks)\n data = @.prepareBulkUpdateData(items)\n\n return @rs.tasks.bulkUpdateTaskTaskboardOrder(@scope.project.id, data)\n\n resortTasks: (tasks) ->\n items = []\n\n for item, index in tasks\n item[\"taskboard_order\"] = index\n if item.isModified()\n items.push(item)\n\n return items\n\n prepareBulkUpdateData: (uses) ->\n return _.map(uses, (x) -> {\"task_id\": x.id, \"order\": x[\"taskboard_order\"]})\n\n taskMove: (ctx, task, usId, statusId, order) ->\n # Remove task from old position\n r = @scope.usTasks[task.user_story][task.status].indexOf(task)\n @scope.usTasks[task.user_story][task.status].splice(r, 1)\n\n # Add task to new position\n tasks = @scope.usTasks[usId][statusId]\n tasks.splice(order, 0, task)\n\n task.user_story = usId\n task.status = statusId\n task.taskboard_order = order\n\n promise = @repo.save(task)\n\n @rootscope.$broadcast(\"sprint:task:moved\", task)\n\n promise.then =>\n @.refreshTasksOrder(tasks)\n @.loadSprintStats()\n\n promise.then null, =>\n console.log \"FAIL TASK SAVE\"\n\n ## Template actions\n addNewTask: (type, us) ->\n switch type\n when \"standard\" then @rootscope.$broadcast(\"taskform:new\", @scope.sprintId, us?.id)\n when \"bulk\" then @rootscope.$broadcast(\"taskform:bulk\", @scope.sprintId, us?.id)\n\n editTaskAssignedTo: (task) ->\n @rootscope.$broadcast(\"assigned-to:add\", task)\n\nmodule.controller(\"TaskboardController\", TaskboardController)\n\n\n#############################################################################\n## TaskboardDirective\n#############################################################################\n\nTaskboardDirective = ($rootscope) ->\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n $el.on \"click\", \".toggle-analytics-visibility\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.toggleClass('active')\n $rootscope.$broadcast(\"taskboard:graph:toggle-visibility\")\n\n tableBodyDom = $el.find(\".taskboard-table-body\")\n tableBodyDom.on \"scroll\", (event) ->\n target = angular.element(event.currentTarget)\n tableHeaderDom = $el.find(\".taskboard-table-header .taskboard-table-inner\")\n tableHeaderDom.css(\"left\", -1 * target.scrollLeft())\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgTaskboard\", [\"$rootScope\", TaskboardDirective])\n\n\n#############################################################################\n## Taskboard Task Directive\n#############################################################################\n\nTaskboardTaskDirective = ($rootscope, $loading, $rs) ->\n link = ($scope, $el, $attrs, $model) ->\n $el.disableSelection()\n\n $scope.$watch \"task\", (task) ->\n if task.is_blocked and not $el.hasClass(\"blocked\")\n $el.addClass(\"blocked\")\n else if not task.is_blocked and $el.hasClass(\"blocked\")\n $el.removeClass(\"blocked\")\n\n $el.find(\".icon-edit\").on \"click\", (event) ->\n if $el.find('.icon-edit').hasClass('noclick')\n return\n $scope.$apply ->\n target = $(event.target)\n\n currentLoading = $loading()\n .target(target)\n .timeout(200)\n .removeClasses(\"icon-edit\")\n .start()\n\n task = $scope.task\n $rs.tasks.getByRef(task.project, task.ref).then (editingTask) =>\n $rootscope.$broadcast(\"taskform:edit\", editingTask)\n currentLoading.finish()\n\n return {link:link}\n\n\nmodule.directive(\"tgTaskboardTask\", [\"$rootScope\", \"$tgLoading\", \"$tgResources\", TaskboardTaskDirective])\n\n#############################################################################\n## Taskboard Squish Column Directive\n#############################################################################\n\nTaskboardSquishColumnDirective = (rs) ->\n avatarWidth = 40\n maxColumnWidth = 300\n\n link = ($scope, $el, $attrs) ->\n $scope.$on \"sprint:task:moved\", () =>\n recalculateTaskboardWidth()\n\n bindOnce $scope, \"usTasks\", (project) ->\n $scope.statusesFolded = rs.tasks.getStatusColumnModes($scope.project.id)\n $scope.usFolded = rs.tasks.getUsRowModes($scope.project.id, $scope.sprintId)\n\n recalculateTaskboardWidth()\n\n $scope.foldStatus = (status) ->\n $scope.statusesFolded[status.id] = !!!$scope.statusesFolded[status.id]\n rs.tasks.storeStatusColumnModes($scope.projectId, $scope.statusesFolded)\n\n recalculateTaskboardWidth()\n\n $scope.foldUs = (us) ->\n if !us\n $scope.usFolded[null] = !!!$scope.usFolded[null]\n else\n $scope.usFolded[us.id] = !!!$scope.usFolded[us.id]\n\n rs.tasks.storeUsRowModes($scope.projectId, $scope.sprintId, $scope.usFolded)\n\n recalculateTaskboardWidth()\n\n getCeilWidth = (usId, statusId) =>\n tasks = $scope.usTasks[usId][statusId].length\n\n if $scope.statusesFolded[statusId]\n if tasks and $scope.usFolded[usId]\n tasksMatrixSize = Math.round(Math.sqrt(tasks))\n width = avatarWidth * tasksMatrixSize\n else\n width = avatarWidth\n\n return width\n\n return 0\n\n setStatusColumnWidth = (statusId, width) =>\n column = $el.find(\".squish-status-#{statusId}\")\n\n if width\n column.css('max-width', width)\n else\n column.css(\"max-width\", maxColumnWidth)\n\n refreshTaskboardTableWidth = () =>\n columnWidths = []\n\n columns = $el.find(\".task-colum-name\")\n\n columnWidths = _.map columns, (column) ->\n return $(column).outerWidth(true)\n\n totalWidth = _.reduce columnWidths, (total, width) ->\n return total + width\n\n $el.find('.taskboard-table-inner').css(\"width\", totalWidth)\n\n recalculateStatusColumnWidth = (statusId) =>\n #unassigned ceil\n statusFoldedWidth = getCeilWidth(null, statusId)\n\n _.forEach $scope.userstories, (us) ->\n width = getCeilWidth(us.id, statusId)\n statusFoldedWidth = width if width > statusFoldedWidth\n\n setStatusColumnWidth(statusId, statusFoldedWidth)\n\n recalculateTaskboardWidth = () =>\n _.forEach $scope.taskStatusList, (status) ->\n recalculateStatusColumnWidth(status.id)\n\n refreshTaskboardTableWidth()\n\n return\n\n return {link: link}\n\nmodule.directive(\"tgTaskboardSquishColumn\", [\"$tgResources\", TaskboardSquishColumnDirective])\n\n#############################################################################\n## Taskboard User Directive\n#############################################################################\n\nTaskboardUserDirective = ($log) ->\n clickable = false\n\n link = ($scope, $el, $attrs) ->\n username_label = $el.parent().find(\"a.task-assigned\")\n username_label.addClass(\"not-clickable\")\n\n $scope.$watch 'task.assigned_to', (assigned_to) ->\n user = $scope.usersById[assigned_to]\n\n if user is undefined\n _.assign($scope, {name: \"Unassigned\", imgurl: \"/images/unnamed.png\", clickable: clickable})\n else\n _.assign($scope, {name: user.full_name_display, imgurl: user.photo, clickable: clickable})\n\n username_label.text($scope.name)\n\n\n bindOnce $scope, \"project\", (project) ->\n if project.my_permissions.indexOf(\"modify_task\") > -1\n clickable = true\n $el.find(\".avatar-assigned-to\").on \"click\", (event) =>\n if $el.find('a').hasClass('noclick')\n return\n\n $ctrl = $el.controller()\n $ctrl.editTaskAssignedTo($scope.task)\n\n username_label.removeClass(\"not-clickable\")\n username_label.on \"click\", (event) ->\n if $el.find('a').hasClass('noclick')\n return\n\n $ctrl = $el.controller()\n $ctrl.editTaskAssignedTo($scope.task)\n\n\n return {\n link: link,\n templateUrl: \"taskboard/taskboard-user.html\",\n scope: {\n \"usersById\": \"=users\",\n \"project\": \"=\",\n \"task\": \"=\",\n }\n }\n\n\nmodule.directive(\"tgTaskboardUserAvatar\", [\"$log\", TaskboardUserDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard/sortable.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\n\nmodule = angular.module(\"taigaBacklog\")\n\n\n#############################################################################\n## Sortable Directive\n#############################################################################\n\nTaskboardSortableDirective = ($repo, $rs, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions we don't enable the sortable\n if not (project.my_permissions.indexOf(\"modify_us\") > -1)\n return\n\n oldParentScope = null\n newParentScope = null\n itemEl = null\n tdom = $el\n\n deleteElement = (itemEl) ->\n # Completelly remove item and its scope from dom\n itemEl.scope().$destroy()\n itemEl.off()\n itemEl.remove()\n\n tdom.sortable({\n handle: \".taskboard-task-inner\",\n dropOnEmpty: true\n connectWith: \".taskboard-tasks-box\"\n revert: 400\n })\n\n tdom.on \"sortstop\", (event, ui) ->\n parentEl = ui.item.parent()\n itemEl = ui.item\n itemTask = itemEl.scope().task\n itemIndex = itemEl.index()\n newParentScope = parentEl.scope()\n\n oldUsId = if oldParentScope.us then oldParentScope.us.id else null\n oldStatusId = oldParentScope.st.id\n newUsId = if newParentScope.us then newParentScope.us.id else null\n newStatusId = newParentScope.st.id\n\n if newStatusId != oldStatusId or newUsId != oldUsId\n deleteElement(itemEl)\n\n $scope.$apply ->\n $rootscope.$broadcast(\"taskboard:task:move\", itemTask, newUsId, newStatusId, itemIndex)\n\n ui.item.find('a').removeClass('noclick')\n\n tdom.on \"sortstart\", (event, ui) ->\n oldParentScope = ui.item.parent().scope()\n ui.item.find('a').addClass('noclick')\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgTaskboardSortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n TaskboardSortableDirective\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/kanban/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ntimeout = @.taiga.timeout\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaKanban\")\n\n# Vars\n\ndefaultViewMode = \"maximized\"\nviewModes = [\n \"maximized\",\n \"minimized\"\n]\n\n\n#############################################################################\n## Kanban Controller\n#############################################################################\n\nclass KanbanController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgEvents\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location,\n @appMetaService, @navUrls, @events, @analytics, @translate) ->\n\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"KANBAN.SECTION_NAME\")\n @scope.statusViewModes = {}\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n title = @translate.instant(\"KANBAN.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"KANBAN.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n initializeEventHandlers: ->\n @scope.$on \"usform:new:success\", =>\n @.loadUserstories()\n @.refreshTagsColors()\n @analytics.trackEvent(\"userstory\", \"create\", \"create userstory on kanban\", 1)\n\n @scope.$on \"usform:bulk:success\", =>\n @.loadUserstories()\n @analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on kanban\", 1)\n\n @scope.$on \"usform:edit:success\", =>\n @.loadUserstories()\n @.refreshTagsColors()\n\n @scope.$on(\"assigned-to:added\", @.onAssignedToChanged)\n @scope.$on(\"kanban:us:move\", @.moveUs)\n @scope.$on(\"kanban:show-userstories-for-status\", @.loadUserStoriesForStatus)\n @scope.$on(\"kanban:hide-userstories-for-status\", @.hideUserStoriesForStatus)\n\n # Template actions\n\n addNewUs: (type, statusId) ->\n switch type\n when \"standard\" then @rootscope.$broadcast(\"usform:new\", @scope.projectId, statusId, @scope.usStatusList)\n when \"bulk\" then @rootscope.$broadcast(\"usform:bulk\", @scope.projectId, statusId)\n\n changeUsAssignedTo: (us) ->\n @rootscope.$broadcast(\"assigned-to:add\", us)\n\n # Scope Events Handlers\n\n onAssignedToChanged: (ctx, userid, us) ->\n us.assigned_to = userid\n\n promise = @repo.save(us)\n promise.then null, ->\n console.log \"FAIL\" # TODO\n\n # Load data methods\n refreshTagsColors: ->\n return @rs.projects.tagsColors(@scope.projectId).then (tags_colors) =>\n @scope.project.tags_colors = tags_colors\n\n loadUserstories: ->\n params = {\n status__is_archived: false\n }\n\n return @rs.userstories.listAll(@scope.projectId, params).then (userstories) =>\n @scope.userstories = userstories\n\n usByStatus = _.groupBy(userstories, \"status\")\n us_archived = []\n for status in @scope.usStatusList\n if not usByStatus[status.id]?\n usByStatus[status.id] = []\n if @scope.usByStatus?\n for us in @scope.usByStatus[status.id]\n if us.status != status.id\n us_archived.push(us)\n\n # Must preserve the archived columns if loaded\n if status.is_archived and @scope.usByStatus? and @scope.usByStatus[status.id].length != 0\n for us in @scope.usByStatus[status.id].concat(us_archived)\n if us.status == status.id\n usByStatus[status.id].push(us)\n\n usByStatus[status.id] = _.sortBy(usByStatus[status.id], \"kanban_order\")\n\n if userstories.length == 0\n status = @scope.usStatusList[0]\n usByStatus[status.id].push({isPlaceholder: true})\n\n @scope.usByStatus = usByStatus\n\n # The broadcast must be executed when the DOM has been fully reloaded.\n # We can't assure when this exactly happens so we need a defer\n scopeDefer @scope, =>\n @scope.$broadcast(\"userstories:loaded\", userstories)\n\n return userstories\n\n loadUserStoriesForStatus: (ctx, statusId) ->\n params = { status: statusId }\n return @rs.userstories.listAll(@scope.projectId, params).then (userstories) =>\n @scope.usByStatus[statusId] = _.sortBy(userstories, \"kanban_order\")\n @scope.$broadcast(\"kanban:shown-userstories-for-status\", statusId, userstories)\n return userstories\n\n hideUserStoriesForStatus: (ctx, statusId) ->\n @scope.usByStatus[statusId] = []\n @scope.$broadcast(\"kanban:hidden-userstories-for-status\", statusId)\n\n loadKanban: ->\n return @q.all([\n @.refreshTagsColors(),\n @.loadUserstories()\n ])\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.is_kanban_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.projectId = project.id\n @scope.points = _.sortBy(project.points, \"order\")\n @scope.pointsById = groupBy(project.points, (x) -> x.id)\n @scope.usStatusById = groupBy(project.us_statuses, (x) -> x.id)\n @scope.usStatusList = _.sortBy(project.us_statuses, \"order\")\n\n @.generateStatusViewModes()\n\n @scope.$emit(\"project:loaded\", project)\n return project\n\n initializeSubscription: ->\n routingKey1 = \"changes.project.#{@scope.projectId}.userstories\"\n @events.subscribe @scope, routingKey1, (message) =>\n @.loadUserstories()\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.initializeSubscription()\n @.loadKanban().then( => @scope.$broadcast(\"redraw:wip\"))\n\n\n ## View Mode methods\n\n generateStatusViewModes: ->\n storedStatusViewModes = @rs.kanban.getStatusViewModes(@scope.projectId)\n\n @scope.statusViewModes = {}\n for status in @scope.usStatusList\n mode = storedStatusViewModes[status.id] || defaultViewMode\n\n @scope.statusViewModes[status.id] = mode\n\n @.storeStatusViewModes()\n\n storeStatusViewModes: ->\n @rs.kanban.storeStatusViewModes(@scope.projectId, @scope.statusViewModes)\n\n updateStatusViewMode: (statusId, newViewMode) ->\n @scope.statusViewModes[statusId] = newViewMode\n @.storeStatusViewModes()\n\n isMaximized: (statusId) ->\n mode = @scope.statusViewModes[statusId] or defaultViewMode\n return mode == 'maximized'\n\n isMinimized: (statusId) ->\n mode = @scope.statusViewModes[statusId] or defaultViewMode\n return mode == 'minimized'\n\n # Utils methods\n\n prepareBulkUpdateData: (uses, field=\"kanban_order\") ->\n return _.map(uses, (x) -> {\"us_id\": x.id, \"order\": x[field]})\n\n resortUserStories: (uses) ->\n items = []\n for item, index in uses\n item.kanban_order = index\n if item.isModified()\n items.push(item)\n\n return items\n\n moveUs: (ctx, us, oldStatusId, newStatusId, index) ->\n if oldStatusId != newStatusId\n # Remove us from old status column\n r = @scope.usByStatus[oldStatusId].indexOf(us)\n @scope.usByStatus[oldStatusId].splice(r, 1)\n\n # Add us to new status column.\n @scope.usByStatus[newStatusId].splice(index, 0, us)\n us.status = newStatusId\n else\n r = @scope.usByStatus[newStatusId].indexOf(us)\n @scope.usByStatus[newStatusId].splice(r, 1)\n @scope.usByStatus[newStatusId].splice(index, 0, us)\n\n itemsToSave = @.resortUserStories(@scope.usByStatus[newStatusId])\n @scope.usByStatus[newStatusId] = _.sortBy(@scope.usByStatus[newStatusId], \"kanban_order\")\n\n # Persist the userstory\n promise = @repo.save(us)\n\n # Rehash userstories order field\n # and persist in bulk all changes.\n promise = promise.then =>\n itemsToSave = _.reject(itemsToSave, {\"id\": us.id})\n data = @.prepareBulkUpdateData(itemsToSave)\n\n return @rs.userstories.bulkUpdateKanbanOrder(us.project, data).then =>\n return itemsToSave\n\n return promise\n\n\nmodule.controller(\"KanbanController\", KanbanController)\n\n#############################################################################\n## Kanban Directive\n#############################################################################\n\nKanbanDirective = ($repo, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n tableBodyDom = $el.find(\".kanban-table-body\")\n\n tableBodyDom.on \"scroll\", (event) ->\n target = angular.element(event.currentTarget)\n tableHeaderDom = $el.find(\".kanban-table-header .kanban-table-inner\")\n tableHeaderDom.css(\"left\", -1 * target.scrollLeft())\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgKanban\", [\"$tgRepo\", \"$rootScope\", KanbanDirective])\n\n#############################################################################\n## Kanban Archived Status Column Header Control\n#############################################################################\n\nKanbanArchivedStatusHeaderDirective = ($rootscope, $translate) ->\n showArchivedText = $translate.instant(\"KANBAN.ACTION_SHOW_ARCHIVED\")\n hideArchivedText = $translate.instant(\"KANBAN.ACTION_HIDE_ARCHIVED\")\n\n link = ($scope, $el, $attrs) ->\n status = $scope.$eval($attrs.tgKanbanArchivedStatusHeader)\n hidden = true\n\n $scope.class = \"icon-open-eye\"\n $scope.title = showArchivedText\n\n $el.on \"click\", (event) ->\n hidden = not hidden\n\n $scope.$apply ->\n if hidden\n $scope.class = \"icon-open-eye\"\n $scope.title = showArchivedText\n $rootscope.$broadcast(\"kanban:hide-userstories-for-status\", status.id)\n\n else\n $scope.class = \"icon-closed-eye\"\n $scope.title = hideArchivedText\n $rootscope.$broadcast(\"kanban:show-userstories-for-status\", status.id)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgKanbanArchivedStatusHeader\", [ \"$rootScope\", \"$translate\", KanbanArchivedStatusHeaderDirective])\n\n\n#############################################################################\n## Kanban Archived Status Column Intro Directive\n#############################################################################\n\nKanbanArchivedStatusIntroDirective = ($translate) ->\n userStories = []\n\n link = ($scope, $el, $attrs) ->\n hiddenUserStoriexText = $translate.instant(\"KANBAN.HIDDEN_USER_STORIES\")\n status = $scope.$eval($attrs.tgKanbanArchivedStatusIntro)\n $el.text(hiddenUserStoriexText)\n\n updateIntroText = ->\n if userStories.length > 0\n $el.text(\"\")\n else\n $el.text(hiddenUserStoriexText)\n\n $scope.$on \"kanban:us:move\", (ctx, itemUs, oldStatusId, newStatusId, itemIndex) ->\n # The destination columnd is this one\n if status.id == newStatusId\n # Reorder\n if status.id == oldStatusId\n r = userStories.indexOf(itemUs)\n userStories.splice(r, 1)\n userStories.splice(itemIndex, 0, itemUs)\n\n # Archiving user story\n else\n itemUs.isArchived = true\n userStories.splice(itemIndex, 0, itemUs)\n\n # Unarchiving user story\n else if status.id == oldStatusId\n itemUs.isArchived = false\n r = userStories.indexOf(itemUs)\n userStories.splice(r, 1)\n\n updateIntroText()\n\n $scope.$on \"kanban:shown-userstories-for-status\", (ctx, statusId, userStoriesLoaded) ->\n if statusId == status.id\n userStories = _.filter(userStoriesLoaded, (us) -> us.status == status.id)\n updateIntroText()\n\n $scope.$on \"kanban:hidden-userstories-for-status\", (ctx, statusId) ->\n if statusId == status.id\n userStories = []\n updateIntroText()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgKanbanArchivedStatusIntro\", [\"$translate\", KanbanArchivedStatusIntroDirective])\n\n\n#############################################################################\n## Kanban User Story Directive\n#############################################################################\n\nKanbanUserstoryDirective = ($rootscope, $loading, $rs) ->\n link = ($scope, $el, $attrs, $model) ->\n $el.disableSelection()\n\n $scope.$watch \"us\", (us) ->\n if us.is_blocked and not $el.hasClass(\"blocked\")\n $el.addClass(\"blocked\")\n else if not us.is_blocked and $el.hasClass(\"blocked\")\n $el.removeClass(\"blocked\")\n\n $el.on 'click', '.icon-edit', (event) ->\n if $el.find(\".icon-edit\").hasClass(\"noclick\")\n return\n\n target = $(event.target)\n\n currentLoading = $loading()\n .target(target)\n .timeout(200)\n .removeClasses(\"icon-edit\")\n .start()\n\n us = $model.$modelValue\n $rs.userstories.getByRef(us.project, us.ref).then (editingUserStory) =>\n $rootscope.$broadcast(\"usform:edit\", editingUserStory)\n currentLoading.finish()\n\n $scope.getTemplateUrl = () ->\n if $scope.us.isPlaceholder\n return \"common/components/kanban-placeholder.html\"\n else\n return \"kanban/kanban-task.html\"\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n template: '',\n link: link\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgKanbanUserstory\", [\"$rootScope\", \"$tgLoading\", \"$tgResources\", KanbanUserstoryDirective])\n\n#############################################################################\n## Kanban Squish Column Directive\n#############################################################################\n\nKanbanSquishColumnDirective = (rs) ->\n\n link = ($scope, $el, $attrs) ->\n $scope.$on \"project:loaded\", (event, project) ->\n $scope.folds = rs.kanban.getStatusColumnModes(project.id)\n updateTableWidth()\n\n $scope.foldStatus = (status) ->\n $scope.folds[status.id] = !!!$scope.folds[status.id]\n rs.kanban.storeStatusColumnModes($scope.projectId, $scope.folds)\n updateTableWidth()\n return\n\n updateTableWidth = ->\n columnWidths = _.map $scope.usStatusList, (status) ->\n if $scope.folds[status.id]\n return 40\n else\n return 310\n totalWidth = _.reduce columnWidths, (total, width) ->\n return total + width\n $el.find('.kanban-table-inner').css(\"width\", totalWidth)\n\n return {link: link}\n\nmodule.directive(\"tgKanbanSquishColumn\", [\"$tgResources\", KanbanSquishColumnDirective])\n\n#############################################################################\n## Kanban WIP Limit Directive\n#############################################################################\n\nKanbanWipLimitDirective = ->\n link = ($scope, $el, $attrs) ->\n $el.disableSelection()\n\n status = $scope.$eval($attrs.tgKanbanWipLimit)\n\n redrawWipLimit = =>\n $el.find(\".kanban-wip-limit\").remove()\n timeout 200, =>\n element = $el.find(\".kanban-task\")[status.wip_limit]\n if element\n angular.element(element).before(\"
\")\n\n if status and not status.is_archived\n $scope.$on \"redraw:wip\", redrawWipLimit\n $scope.$on \"kanban:us:move\", redrawWipLimit\n $scope.$on \"usform:new:success\", redrawWipLimit\n $scope.$on \"usform:bulk:success\", redrawWipLimit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgKanbanWipLimit\", KanbanWipLimitDirective)\n\n\n#############################################################################\n## Kanban User Directive\n#############################################################################\n\nKanbanUserDirective = ($log, $compile) ->\n template = _.template(\"\"\"\n
\n class=\"not-clickable\"<% } %>>\n \" alt=\"<%- name %>\" class=\"avatar\">\n \n
\n \"\"\")\n\n clickable = false\n\n link = ($scope, $el, $attrs, $model) ->\n username_label = $el.parent().find(\"a.task-assigned\")\n username_label.addClass(\"not-clickable\")\n\n if not $attrs.tgKanbanUserAvatar\n return $log.error \"KanbanUserDirective: no attr is defined\"\n\n wtid = $scope.$watch $attrs.tgKanbanUserAvatar, (v) ->\n if not $scope.usersById?\n $log.error \"KanbanUserDirective requires userById set in scope.\"\n wtid()\n else\n user = $scope.usersById[v]\n render(user)\n\n render = (user) ->\n if user is undefined\n ctx = {name: \"Unassigned\", imgurl: \"/images/unnamed.png\", clickable: clickable}\n else\n ctx = {name: user.full_name_display, imgurl: user.photo, clickable: clickable}\n\n html = $compile(template(ctx))($scope)\n $el.html(html)\n username_label.text(ctx.name)\n\n bindOnce $scope, \"project\", (project) ->\n if project.my_permissions.indexOf(\"modify_us\") > -1\n clickable = true\n $el.on \"click\", (event) =>\n if $el.find(\"a\").hasClass(\"noclick\")\n return\n\n us = $model.$modelValue\n $ctrl = $el.controller()\n $ctrl.changeUsAssignedTo(us)\n\n username_label.removeClass(\"not-clickable\")\n username_label.on \"click\", (event) ->\n if $el.find(\"a\").hasClass(\"noclick\")\n return\n\n us = $model.$modelValue\n $ctrl = $el.controller()\n $ctrl.changeUsAssignedTo(us)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link, require:\"ngModel\"}\n\nmodule.directive(\"tgKanbanUserAvatar\", [\"$log\", \"$compile\", KanbanUserDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/kanban/sortable.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ntimeout = @.taiga.timeout\n\nmodule = angular.module(\"taigaKanban\")\n\n\n#############################################################################\n## Sortable Directive\n#############################################################################\n\nKanbanSortableDirective = ($repo, $rs, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"project\", (project) ->\n if not (project.my_permissions.indexOf(\"modify_us\") > -1)\n return\n\n oldParentScope = null\n newParentScope = null\n itemEl = null\n tdom = $el\n\n deleteElement = (itemEl) ->\n # Completelly remove item and its scope from dom\n itemEl.scope().$destroy()\n itemEl.off()\n itemEl.remove()\n\n tdom.sortable({\n handle: \".kanban-task-inner\"\n dropOnEmpty: true\n connectWith: \".kanban-uses-box\"\n revert: 400\n })\n\n tdom.on \"sortstop\", (event, ui) ->\n parentEl = ui.item.parent()\n itemEl = ui.item\n itemUs = itemEl.scope().us\n itemIndex = itemEl.index()\n newParentScope = parentEl.scope()\n\n newStatusId = newParentScope.s.id\n oldStatusId = oldParentScope.s.id\n\n if newStatusId != oldStatusId\n deleteElement(itemEl)\n\n $scope.$apply ->\n $rootscope.$broadcast(\"kanban:us:move\", itemUs, itemUs.status, newStatusId, itemIndex)\n\n ui.item.find('a').removeClass('noclick')\n\n tdom.on \"sortstart\", (event, ui) ->\n oldParentScope = ui.item.parent().scope()\n ui.item.find('a').addClass('noclick')\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgKanbanSortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n KanbanSortableDirective\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoString = @.taiga.toString\njoinStr = @.taiga.joinStr\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaIssues\")\n\n#############################################################################\n## Issue Detail Controller\n#############################################################################\n\nclass IssueDetailController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$log\",\n \"tgAppMetaService\",\n \"$tgAnalytics\",\n \"$tgNavUrls\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location,\n @log, @appMetaService, @analytics, @navUrls, @translate) ->\n bindMethods(@)\n\n @scope.issueRef = @params.issueref\n @scope.sectionName = @translate.instant(\"ISSUES.SECTION_NAME\")\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n @._setMeta()\n @.initializeOnDeleteGoToUrl()\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n title = @translate.instant(\"ISSUE.PAGE_TITLE\", {\n issueRef: \"##{@scope.issue.ref}\"\n issueSubject: @scope.issue.subject\n projectName: @scope.project.name\n })\n description = @translate.instant(\"ISSUE.PAGE_DESCRIPTION\", {\n issueStatus: @scope.statusById[@scope.issue.status]?.name or \"--\"\n issueType: @scope.typeById[@scope.issue.type]?.name or \"--\"\n issueSeverity: @scope.severityById[@scope.issue.severity]?.name or \"--\"\n issuePriority: @scope.priorityById[@scope.issue.priority]?.name or \"--\"\n issueDescription: angular.element(@scope.issue.description_html or \"\").text()\n })\n @appMetaService.setAll(title, description)\n\n initializeEventHandlers: ->\n @scope.$on \"attachment:create\", =>\n @analytics.trackEvent(\"attachment\", \"create\", \"create attachment on issue\", 1)\n\n @scope.$on \"promote-issue-to-us:success\", =>\n @analytics.trackEvent(\"issue\", \"promoteToUserstory\", \"promote issue to userstory\", 1)\n @rootscope.$broadcast(\"object:updated\")\n @.loadIssue()\n\n @scope.$on \"comment:new\", =>\n @.loadIssue()\n\n @scope.$on \"custom-attributes-values:edit\", =>\n @rootscope.$broadcast(\"object:updated\")\n\n initializeOnDeleteGoToUrl: ->\n ctx = {project: @scope.project.slug}\n if @scope.project.is_issues_activated\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-issues\", ctx)\n else\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project\", ctx)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.statusList = project.issue_statuses\n @scope.statusById = groupBy(project.issue_statuses, (x) -> x.id)\n @scope.typeById = groupBy(project.issue_types, (x) -> x.id)\n @scope.typeList = _.sortBy(project.issue_types, \"order\")\n @scope.severityList = project.severities\n @scope.severityById = groupBy(project.severities, (x) -> x.id)\n @scope.priorityList = project.priorities\n @scope.priorityById = groupBy(project.priorities, (x) -> x.id)\n return project\n\n loadIssue: ->\n return @rs.issues.getByRef(@scope.projectId, @params.issueref).then (issue) =>\n @scope.issue = issue\n @scope.issueId = issue.id\n @scope.commentModel = issue\n\n if @scope.issue.neighbors.previous.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.issue.neighbors.previous.ref\n }\n @scope.previousUrl = @navUrls.resolve(\"project-issues-detail\", ctx)\n\n if @scope.issue.neighbors.next.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.issue.neighbors.next.ref\n }\n @scope.nextUrl = @navUrls.resolve(\"project-issues-detail\", ctx)\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.loadIssue()\n\n ###\n # Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n # See app/modules/components/vote-button for more info\n ###\n onUpvote: ->\n onSuccess = =>\n @.loadIssue()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.issues.upvote(@scope.issueId).then(onSuccess, onError)\n\n onDownvote: ->\n onSuccess = =>\n @.loadIssue()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.issues.downvote(@scope.issueId).then(onSuccess, onError)\n\n ###\n # Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n # See app/modules/components/watch-button for more info\n ###\n onWatch: ->\n onSuccess = =>\n @.loadIssue()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.issues.watch(@scope.issueId).then(onSuccess, onError)\n\n onUnwatch: ->\n onSuccess = =>\n @.loadIssue()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.issues.unwatch(@scope.issueId).then(onSuccess, onError)\n\nmodule.controller(\"IssueDetailController\", IssueDetailController)\n\n\n#############################################################################\n## Issue status display directive\n#############################################################################\n\nIssueStatusDisplayDirective = ($template, $compile)->\n # Display if a Issue is open or closed and its issueboard status.\n #\n # Example:\n # tg-issue-status-display(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.statusById object\n\n template = $template.get(\"common/components/status-display.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (issue) ->\n status = $scope.statusById[issue.status]\n\n html = template({\n is_closed: status.is_closed\n status: status\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssueStatusDisplay\", [\"$tgTemplate\", \"$compile\", IssueStatusDisplayDirective])\n\n\n#############################################################################\n## Issue status button directive\n#############################################################################\n\nIssueStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->\n # Display the status of Issue and you can edit it.\n #\n # Example:\n # tg-issue-status-button(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.statusById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"issue/issues-status-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_issue\") != -1\n\n render = (issue) =>\n status = $scope.statusById[issue.status]\n\n html = template({\n status: status\n statuses: $scope.statusList\n editable: isEditable()\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (statusId) =>\n $.fn.popover().closeAll()\n\n issue = $model.$modelValue.clone()\n issue.status = statusId\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(issue)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n onError = ->\n $confirm.notify(\"error\")\n issue.revert()\n $model.$setViewValue(issue)\n currentLoading.finish()\n\n\n $repo.save(issue).then(onSuccess, onError)\n\n $el.on \"click\", \".status-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n\n save(target.data(\"status-id\"))\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssueStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueStatusButtonDirective])\n\n#############################################################################\n## Issue type button directive\n#############################################################################\n\nIssueTypeButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->\n # Display the type of Issue and you can edit it.\n #\n # Example:\n # tg-issue-type-button(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.typeById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"issue/issue-type-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_issue\") != -1\n\n render = (issue) =>\n type = $scope.typeById[issue.type]\n\n html = template({\n type: type\n typees: $scope.typeList\n editable: isEditable()\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (type) =>\n $.fn.popover().closeAll()\n issue = $model.$modelValue.clone()\n issue.type = type\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(issue)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n\n onError = ->\n $confirm.notify(\"error\")\n issue.revert()\n $model.$setViewValue(issue)\n currentLoading.finish()\n\n $repo.save(issue).then(onSuccess, onError)\n\n $el.on \"click\", \".type-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-type\").popover().open()\n\n $el.on \"click\", \".type\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n type = target.data(\"type-id\")\n save(type)\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssueTypeButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueTypeButtonDirective])\n\n\n#############################################################################\n## Issue severity button directive\n#############################################################################\n\nIssueSeverityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->\n # Display the severity of Issue and you can edit it.\n #\n # Example:\n # tg-issue-severity-button(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.severityById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"issue/issue-severity-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_issue\") != -1\n\n render = (issue) =>\n severity = $scope.severityById[issue.severity]\n\n html = template({\n severity: severity\n severityes: $scope.severityList\n editable: isEditable()\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (severity) =>\n $.fn.popover().closeAll()\n\n issue = $model.$modelValue.clone()\n issue.severity = severity\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(issue)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n onError = ->\n $confirm.notify(\"error\")\n issue.revert()\n $model.$setViewValue(issue)\n currentLoading.finish()\n\n $repo.save(issue).then(onSuccess, onError)\n\n $el.on \"click\", \".severity-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-severity\").popover().open()\n\n $el.on \"click\", \".severity\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n severity = target.data(\"severity-id\")\n\n save(severity)\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssueSeverityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueSeverityButtonDirective])\n\n\n#############################################################################\n## Issue priority button directive\n#############################################################################\n\nIssuePriorityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->\n # Display the priority of Issue and you can edit it.\n #\n # Example:\n # tg-issue-priority-button(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.priorityById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"issue/issue-priority-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_issue\") != -1\n\n render = (issue) =>\n priority = $scope.priorityById[issue.priority]\n\n html = template({\n priority: priority\n priorityes: $scope.priorityList\n editable: isEditable()\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (priority) =>\n $.fn.popover().closeAll()\n\n issue = $model.$modelValue.clone()\n issue.priority = priority\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(issue)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n onError = ->\n $confirm.notify(\"error\")\n issue.revert()\n $model.$setViewValue(issue)\n currentLoading.finish()\n\n $repo.save(issue).then(onSuccess, onError)\n\n $el.on \"click\", \".priority-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-priority\").popover().open()\n\n $el.on \"click\", \".priority\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n priority = target.data(\"priority-id\")\n\n save(priority)\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssuePriorityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssuePriorityButtonDirective])\n\n\n#############################################################################\n## Promote Issue to US button directive\n#############################################################################\n\nPromoteIssueToUsButtonDirective = ($rootScope, $repo, $confirm, $qqueue, $translate) ->\n link = ($scope, $el, $attrs, $model) ->\n\n save = $qqueue.bindAdd (issue, askResponse) =>\n data = {\n generated_from_issue: issue.id\n project: issue.project,\n subject: issue.subject\n description: issue.description\n tags: issue.tags\n is_blocked: issue.is_blocked\n blocked_note: issue.blocked_note\n }\n\n onSuccess = ->\n askResponse.finish()\n $confirm.notify(\"success\")\n $rootScope.$broadcast(\"promote-issue-to-us:success\")\n\n onError = ->\n askResponse.finish()\n $confirm.notify(\"error\")\n\n $repo.create(\"userstories\", data).then(onSuccess, onError)\n\n\n $el.on \"click\", \"a\", (event) ->\n event.preventDefault()\n issue = $model.$modelValue\n\n title = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.TITLE\")\n message = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.MESSAGE\")\n subtitle = issue.subject\n\n $confirm.ask(title, subtitle, message).then (response) =>\n save(issue, response)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n restrict: \"AE\"\n require: \"ngModel\"\n templateUrl: \"issue/promote-issue-to-us-button.html\"\n link: link\n }\n\nmodule.directive(\"tgPromoteIssueToUsButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgQqueue\", \"$translate\"\n PromoteIssueToUsButtonDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues/lightboxes.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaIssues\")\n\n#############################################################################\n## Issue Create Lightbox Directive\n#############################################################################\n\nCreateIssueDirective = ($repo, $confirm, $rootscope, lightboxService, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley()\n $scope.issue = {}\n\n $scope.$on \"issueform:new\", (ctx, project)->\n $el.find(\".tag-input\").val(\"\")\n\n lightboxService.open($el)\n\n $scope.issue = {\n project: project.id\n subject: \"\"\n status: project.default_issue_status\n type: project.default_issue_type\n priority: project.default_priority\n severity: project.default_severity\n tags: []\n }\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.create(\"issues\", $scope.issue)\n\n promise.then (data) ->\n currentLoading.finish()\n $rootscope.$broadcast(\"issueform:new:success\", data)\n lightboxService.close($el)\n $confirm.notify(\"success\")\n\n promise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n\n return {link:link}\n\nmodule.directive(\"tgLbCreateIssue\", [\"$tgRepo\", \"$tgConfirm\", \"$rootScope\", \"lightboxService\", \"$tgLoading\",\n CreateIssueDirective])\n\n\n#############################################################################\n## Issue Bulk Create Lightbox Directive\n#############################################################################\n\nCreateBulkIssuesDirective = ($repo, $rs, $confirm, $rootscope, $loading, lightboxService) ->\n link = ($scope, $el, attrs) ->\n $scope.$on \"issueform:bulk\", (ctx, projectId, status)->\n lightboxService.open($el)\n $scope.new = {\n projectId: projectId\n bulk: \"\"\n }\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n data = $scope.new.bulk\n projectId = $scope.new.projectId\n\n promise = $rs.issues.bulkCreate(projectId, data)\n promise.then (result) ->\n currentLoading.finish()\n $rootscope.$broadcast(\"issueform:new:success\", result)\n lightboxService.close($el)\n $confirm.notify(\"success\")\n\n promise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgLbCreateBulkIssues\", [\"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\",\n \"lightboxService\", CreateBulkIssuesDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues/list.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntrim = @.taiga.trim\ntoString = @.taiga.toString\njoinStr = @.taiga.joinStr\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\ndebounceLeading = @.taiga.debounceLeading\nstartswith = @.taiga.startswith\n\nmodule = angular.module(\"taigaIssues\")\n\n#############################################################################\n## Issues Controller\n#############################################################################\n\nclass IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$tgUrls\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgEvents\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @urls, @params, @q, @location, @appMetaService,\n @navUrls, @events, @analytics, @translate) ->\n @scope.sectionName = \"Issues\"\n @scope.filters = {}\n\n if _.isEmpty(@location.search())\n filters = @rs.issues.getFilters(@params.pslug)\n filters.page = 1\n @location.search(filters)\n @location.replace()\n return\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n title = @translate.instant(\"ISSUES.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"ISSUES.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"issueform:new:success\", =>\n @analytics.trackEvent(\"issue\", \"create\", \"create issue on issues list\", 1)\n @.loadIssues()\n\n initializeSubscription: ->\n routingKey = \"changes.project.#{@scope.projectId}.issues\"\n @events.subscribe @scope, routingKey, (message) =>\n @.loadIssues()\n\n storeFilters: ->\n @rs.issues.storeFilters(@params.pslug, @location.search())\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.is_issues_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n\n @scope.issueStatusById = groupBy(project.issue_statuses, (x) -> x.id)\n @scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\")\n @scope.severityById = groupBy(project.severities, (x) -> x.id)\n @scope.severityList = _.sortBy(project.severities, \"order\")\n @scope.priorityById = groupBy(project.priorities, (x) -> x.id)\n @scope.priorityList = _.sortBy(project.priorities, \"order\")\n @scope.issueTypes = _.sortBy(project.issue_types, \"order\")\n @scope.issueTypeById = groupBy(project.issue_types, (x) -> x.id)\n\n return project\n\n getUrlFilters: ->\n filters = _.pick(@location.search(), \"page\", \"tags\", \"status\", \"types\",\n \"q\", \"severities\", \"priorities\",\n \"assignedTo\", \"createdBy\", \"orderBy\")\n\n filters.page = 1 if not filters.page\n return filters\n\n getUrlFilter: (name) ->\n filters = _.pick(@location.search(), name)\n return filters[name]\n\n loadMyFilters: ->\n return @rs.issues.getMyFilters(@scope.projectId).then (filters) =>\n return _.map filters, (value, key) =>\n return {id: key, name: key, type: \"myFilters\", selected: false}\n\n removeNotExistingFiltersFromUrl: ->\n currentSearch = @location.search()\n urlfilters = @.getUrlFilters()\n\n for filterName, filterValue of urlfilters\n if filterName == \"page\" or filterName == \"orderBy\" or filterName == \"q\"\n continue\n\n if filterName == \"tags\"\n splittedValues = _.map(\"#{filterValue}\".split(\",\"))\n else\n splittedValues = _.map(\"#{filterValue}\".split(\",\"), (x) -> if x == \"null\" then null else parseInt(x))\n\n existingValues = _.intersection(splittedValues, _.map(@scope.filters[filterName], \"id\"))\n if splittedValues.length != existingValues.length\n @location.search(filterName, existingValues.join())\n\n if currentSearch != @location.search()\n @location.replace()\n\n markSelectedFilters: (filters, urlfilters) ->\n # Build selected filters (from url) fast lookup data structure\n searchdata = {}\n for name, value of _.omit(urlfilters, \"page\", \"orderBy\")\n if not searchdata[name]?\n searchdata[name] = {}\n\n for val in \"#{value}\".split(\",\")\n searchdata[name][val] = true\n\n isSelected = (type, id) ->\n if searchdata[type]? and searchdata[type][id]\n return true\n return false\n\n for key, value of filters\n for obj in value\n obj.selected = if isSelected(obj.type, obj.id) then true else undefined\n\n loadFilters: ->\n urlfilters = @.getUrlFilters()\n\n if urlfilters.q\n @scope.filtersQ = urlfilters.q\n\n # Load My Filters\n promise = @.loadMyFilters().then (myFilters) =>\n @scope.filters.myFilters = myFilters\n return myFilters\n\n loadFilters = {}\n loadFilters.project = @scope.projectId\n loadFilters.tags = urlfilters.tags\n loadFilters.status = urlfilters.status\n loadFilters.q = urlfilters.q\n loadFilters.types = urlfilters.types\n loadFilters.severities = urlfilters.severities\n loadFilters.priorities = urlfilters.priorities\n loadFilters.assigned_to = urlfilters.assignedTo\n loadFilters.owner = urlfilters.createdBy\n\n # Load default filters data\n promise = promise.then =>\n return @rs.issues.filtersData(loadFilters)\n\n # Format filters and set them on scope\n return promise.then (data) =>\n usersFiltersFormat = (users, type, unknownOption) =>\n reformatedUsers = _.map users, (t) =>\n t.type = type\n t.name = if t.full_name then t.full_name else unknownOption\n\n return t\n\n unknownItem = _.remove(reformatedUsers, (u) -> not u.id)\n reformatedUsers = _.sortBy(reformatedUsers, (u) -> u.name.toUpperCase())\n if unknownItem.length > 0\n reformatedUsers.unshift(unknownItem[0])\n return reformatedUsers\n\n choicesFiltersFormat = (choices, type, byIdObject) =>\n _.map choices, (t) ->\n t.type = type\n return t\n\n tagsFilterFormat = (tags) =>\n return _.map tags, (t) ->\n t.id = t.name\n t.type = 'tags'\n return t\n\n # Build filters data structure\n @scope.filters.status = choicesFiltersFormat(data.statuses, \"status\", @scope.issueStatusById)\n @scope.filters.severities = choicesFiltersFormat(data.severities, \"severities\", @scope.severityById)\n @scope.filters.priorities = choicesFiltersFormat(data.priorities, \"priorities\", @scope.priorityById)\n @scope.filters.assignedTo = usersFiltersFormat(data.assigned_to, \"assignedTo\", \"Unassigned\")\n @scope.filters.createdBy = usersFiltersFormat(data.owners, \"createdBy\", \"Unknown\")\n @scope.filters.types = choicesFiltersFormat(data.types, \"types\", @scope.issueTypeById)\n @scope.filters.tags = tagsFilterFormat(data.tags)\n\n @.removeNotExistingFiltersFromUrl()\n @.markSelectedFilters(@scope.filters, urlfilters)\n\n @rootscope.$broadcast(\"filters:loaded\", @scope.filters)\n\n # We need to guarantee that the last petition done here is the finally used\n # When searching by text loadIssues can be called fastly with different parameters and\n # can be resolved in a different order than generated\n # We count the requests made and only if the callback is for the last one data is updated\n loadIssuesRequests: 0\n loadIssues: =>\n @scope.urlFilters = @.getUrlFilters()\n\n # Convert stored filters to http parameters\n # ready filters (the name difference exists\n # because of some automatic lookups and is\n # the simplest way todo it without adding\n # additional complexity to code.\n @scope.httpParams = {}\n for name, values of @scope.urlFilters\n if name == \"severities\"\n name = \"severity\"\n else if name == \"orderBy\"\n name = \"order_by\"\n else if name == \"priorities\"\n name = \"priority\"\n else if name == \"assignedTo\"\n name = \"assigned_to\"\n else if name == \"createdBy\"\n name = \"owner\"\n else if name == \"status\"\n name = \"status\"\n else if name == \"types\"\n name = \"type\"\n @scope.httpParams[name] = values\n\n promise = @rs.issues.list(@scope.projectId, @scope.httpParams)\n @.loadIssuesRequests += 1\n promise.index = @.loadIssuesRequests\n promise.then (data) =>\n if promise.index == @.loadIssuesRequests\n @scope.issues = data.models\n @scope.page = data.current\n @scope.count = data.count\n @scope.paginatedBy = data.paginatedBy\n\n return data\n\n return promise\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.initializeSubscription()\n @.loadFilters()\n\n return @.loadIssues()\n\n saveCurrentFiltersTo: (newFilter) ->\n deferred = @q.defer()\n @rs.issues.getMyFilters(@scope.projectId).then (filters) =>\n filters[newFilter] = @location.search()\n @rs.issues.storeMyFilters(@scope.projectId, filters).then =>\n deferred.resolve()\n return deferred.promise\n\n deleteMyFilter: (filter) ->\n deferred = @q.defer()\n @rs.issues.getMyFilters(@scope.projectId).then (filters) =>\n delete filters[filter]\n @rs.issues.storeMyFilters(@scope.projectId, filters).then =>\n deferred.resolve()\n return deferred.promise\n\n # Functions used from templates\n addNewIssue: ->\n @rootscope.$broadcast(\"issueform:new\", @scope.project)\n\n addIssuesInBulk: ->\n @rootscope.$broadcast(\"issueform:bulk\", @scope.projectId)\n\n\nmodule.controller(\"IssuesController\", IssuesController)\n\n#############################################################################\n## Issues Directive\n#############################################################################\n\nIssuesDirective = ($log, $location, $template, $compile) ->\n ## Issues Pagination\n template = $template.get(\"issue/issue-paginator.html\", true)\n\n linkPagination = ($scope, $el, $attrs, $ctrl) ->\n # Constants\n afterCurrent = 2\n beforeCurrent = 4\n atBegin = 2\n atEnd = 2\n\n $pagEl = $el.find(\".issues-paginator\")\n\n getNumPages = ->\n numPages = $scope.count / $scope.paginatedBy\n if parseInt(numPages, 10) < numPages\n numPages = parseInt(numPages, 10) + 1\n else\n numPages = parseInt(numPages, 10)\n\n return numPages\n\n renderPagination = ->\n numPages = getNumPages()\n\n if numPages <= 1\n $pagEl.hide()\n return\n $pagEl.show()\n\n pages = []\n options = {}\n options.pages = pages\n options.showPrevious = ($scope.page > 1)\n options.showNext = not ($scope.page == numPages)\n\n cpage = $scope.page\n\n for i in [1..numPages]\n if i == (cpage + afterCurrent) and numPages > (cpage + afterCurrent + atEnd)\n pages.push({classes: \"dots\", type: \"dots\"})\n else if i == (cpage - beforeCurrent) and cpage > (atBegin + beforeCurrent)\n pages.push({classes: \"dots\", type: \"dots\"})\n else if i > (cpage + afterCurrent) and i <= (numPages - atEnd)\n else if i < (cpage - beforeCurrent) and i > atBegin\n else if i == cpage\n pages.push({classes: \"active\", num: i, type: \"page-active\"})\n else\n pages.push({classes: \"page\", num: i, type: \"page\"})\n\n\n html = template(options)\n html = $compile(html)($scope)\n\n $pagEl.html(html)\n\n $scope.$watch \"issues\", (value) ->\n # Do nothing if value is not logical true\n return if not value\n\n renderPagination()\n\n $el.on \"click\", \".issues-paginator a.next\", (event) ->\n event.preventDefault()\n\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", $scope.page + 1)\n $ctrl.loadIssues()\n\n $el.on \"click\", \".issues-paginator a.previous\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", $scope.page - 1)\n $ctrl.loadIssues()\n\n $el.on \"click\", \".issues-paginator li.page > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n pagenum = target.data(\"pagenum\")\n\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", pagenum)\n $ctrl.loadIssues()\n\n ## Issues Filters\n linkOrdering = ($scope, $el, $attrs, $ctrl) ->\n # Draw the arrow the first time\n currentOrder = $ctrl.getUrlFilter(\"orderBy\") or \"created_date\"\n if currentOrder\n icon = if startswith(currentOrder, \"-\") then \"icon-arrow-up\" else \"icon-arrow-bottom\"\n colHeadElement = $el.find(\".row.title > div[data-fieldname='#{trim(currentOrder, \"-\")}']\")\n colHeadElement.html(\"#{colHeadElement.html()}\")\n\n $el.on \"click\", \".row.title > div\", (event) ->\n target = angular.element(event.currentTarget)\n\n currentOrder = $ctrl.getUrlFilter(\"orderBy\")\n newOrder = target.data(\"fieldname\")\n\n finalOrder = if currentOrder == newOrder then \"-#{newOrder}\" else newOrder\n\n $scope.$apply ->\n $ctrl.replaceFilter(\"orderBy\", finalOrder)\n $ctrl.storeFilters()\n $ctrl.loadIssues().then ->\n # Update the arrow\n $el.find(\".row.title > div > span.icon\").remove()\n icon = if startswith(finalOrder, \"-\") then \"icon-arrow-up\" else \"icon-arrow-bottom\"\n target.html(\"#{target.html()}\")\n\n ## Issues Link\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n linkOrdering($scope, $el, $attrs, $ctrl)\n linkPagination($scope, $el, $attrs, $ctrl)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgIssues\", [\"$log\", \"$tgLocation\", \"$tgTemplate\", \"$compile\", IssuesDirective])\n\n\n#############################################################################\n## Issues Filters Directive\n#############################################################################\n\nIssuesFiltersDirective = ($q, $log, $location, $rs, $confirm, $loading, $template, $translate, $compile, $auth) ->\n template = $template.get(\"issue/issues-filters.html\", true)\n templateSelected = $template.get(\"issue/issues-filters-selected.html\", true)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.closest(\".wrapper\").controller()\n\n selectedFilters = []\n\n showFilters = (title, type) ->\n $el.find(\".filters-cats\").hide()\n $el.find(\".filter-list\").removeClass(\"hidden\")\n $el.find(\"h2.breadcrumb\").removeClass(\"hidden\")\n $el.find(\"h2 a.subfilter span.title\").html(title)\n $el.find(\"h2 a.subfilter span.title\").prop(\"data-type\", type)\n\n showCategories = ->\n $el.find(\".filters-cats\").show()\n $el.find(\".filter-list\").addClass(\"hidden\")\n $el.find(\"h2.breadcrumb\").addClass(\"hidden\")\n\n initializeSelectedFilters = (filters) ->\n selectedFilters = []\n for name, values of filters\n for val in values\n selectedFilters.push(val) if val.selected\n\n renderSelectedFilters(selectedFilters)\n\n renderSelectedFilters = (selectedFilters) ->\n _.filter selectedFilters, (f) =>\n if f.color\n f.style = \"border-left: 3px solid #{f.color}\"\n\n html = templateSelected({filters:selectedFilters})\n html = $compile(html)($scope)\n $el.find(\".filters-applied\").html(html)\n\n if $auth.isAuthenticated() && selectedFilters.length > 0\n $el.find(\".save-filters\").show()\n else\n $el.find(\".save-filters\").hide()\n\n renderFilters = (filters) ->\n _.filter filters, (f) =>\n if f.color\n f.style = \"border-left: 3px solid #{f.color}\"\n\n html = template({filters:filters})\n html = $compile(html)($scope)\n $el.find(\".filter-list\").html(html)\n\n getFiltersType = () ->\n return $el.find(\"h2 a.subfilter span.title\").prop('data-type')\n\n reloadIssues = () ->\n currentFiltersType = getFiltersType()\n\n $q.all([$ctrl.loadIssues(), $ctrl.loadFilters()]).then () ->\n filters = $scope.filters[currentFiltersType]\n renderFilters(_.reject(filters, \"selected\"))\n\n toggleFilterSelection = (type, id) ->\n if type == \"myFilters\"\n $rs.issues.getMyFilters($scope.projectId).then (data) ->\n myFilters = data\n filters = myFilters[id]\n filters.page = 1\n $ctrl.replaceAllFilters(filters)\n $ctrl.storeFilters()\n $ctrl.loadIssues()\n $ctrl.markSelectedFilters($scope.filters, filters)\n initializeSelectedFilters($scope.filters)\n return null\n\n filters = $scope.filters[type]\n filterId = if type == 'tags' then taiga.toString(id) else id\n filter = _.find(filters, {id: filterId})\n filter.selected = (not filter.selected)\n\n # Convert id to null as string for properly\n # put null value on url parameters\n id = \"null\" if id is null\n\n if filter.selected\n selectedFilters.push(filter)\n $ctrl.selectFilter(type, id)\n $ctrl.selectFilter(\"page\", 1)\n $ctrl.storeFilters()\n else\n selectedFilters = _.reject selectedFilters, (f) ->\n return f.id == filter.id && f.type == filter.type\n\n $ctrl.unselectFilter(type, id)\n $ctrl.selectFilter(\"page\", 1)\n $ctrl.storeFilters()\n\n reloadIssues()\n\n renderSelectedFilters(selectedFilters)\n\n currentFiltersType = getFiltersType()\n\n if type == currentFiltersType\n renderFilters(_.reject(filters, \"selected\"))\n\n # Angular Watchers\n $scope.$on \"filters:loaded\", (ctx, filters) ->\n initializeSelectedFilters(filters)\n\n $scope.$on \"filters:issueupdate\", (ctx, filters) ->\n html = template({filters:filters.status})\n html = $compile(html)($scope)\n $el.find(\".filter-list\").html(html)\n\n selectQFilter = debounceLeading 100, (value) ->\n return if value is undefined\n\n $ctrl.replaceFilter(\"page\", null, true)\n\n if value.length == 0\n $ctrl.replaceFilter(\"q\", null)\n $ctrl.storeFilters()\n else\n $ctrl.replaceFilter(\"q\", value)\n $ctrl.storeFilters()\n\n reloadIssues()\n\n $scope.$watch(\"filtersQ\", selectQFilter)\n\n # Dom Event Handlers\n $el.on \"click\", \".filters-cats > ul > li > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n tags = $scope.filters[target.data(\"type\")]\n renderFilters(_.reject(tags, \"selected\"))\n showFilters(target.attr(\"title\"), target.data(\"type\"))\n\n $el.on \"click\", \".filters-inner > .filters-step-cat > .breadcrumb > .back\", (event) ->\n event.preventDefault()\n showCategories($el)\n\n $el.on \"click\", \".filters-applied a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n id = target.data(\"id\") or null\n type = target.data(\"type\")\n toggleFilterSelection(type, id)\n\n $el.on \"click\", \".filter-list .single-filter\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.toggleClass(\"active\")\n\n id = target.data(\"id\") or null\n type = target.data(\"type\")\n\n # A saved filter can't be active\n if type == \"myFilters\"\n target.removeClass(\"active\")\n\n toggleFilterSelection(type, id)\n\n $el.on \"click\", \".filter-list .single-filter .icon-delete\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n\n target = angular.element(event.currentTarget)\n customFilterName = target.parent().data('id')\n title = $translate.instant(\"ISSUES.FILTERS.CONFIRM_DELETE.TITLE\")\n message = $translate.instant(\"ISSUES.FILTERS.CONFIRM_DELETE.MESSAGE\", {customFilterName: customFilterName})\n\n $confirm.askOnDelete(title, message).then (askResponse) ->\n promise = $ctrl.deleteMyFilter(customFilterName)\n promise.then ->\n promise = $ctrl.loadMyFilters()\n promise.then (filters) ->\n askResponse.finish()\n $scope.filters.myFilters = filters\n renderFilters($scope.filters.myFilters)\n promise.then null, ->\n askResponse.finish()\n promise.then null, ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n\n $el.on \"click\", \".save-filters\", (event) ->\n event.preventDefault()\n renderFilters($scope.filters[\"myFilters\"])\n showFilters(\"My filters\", \"myFilters\")\n $el.find('.save-filters').hide()\n $el.find('.my-filter-name').removeClass(\"hidden\")\n $el.find('.my-filter-name').focus()\n $scope.$apply()\n\n $el.on \"keyup\", \".my-filter-name\", (event) ->\n event.preventDefault()\n if event.keyCode == 13\n target = angular.element(event.currentTarget)\n newFilter = target.val()\n currentLoading = $loading()\n .target($el.find(\".new\"))\n .start()\n promise = $ctrl.saveCurrentFiltersTo(newFilter)\n promise.then ->\n loadPromise = $ctrl.loadMyFilters()\n loadPromise.then (filters) ->\n currentLoading.finish()\n $scope.filters.myFilters = filters\n\n currentfilterstype = $el.find(\"h2 a.subfilter span.title\").prop('data-type')\n if currentfilterstype == \"myFilters\"\n renderFilters($scope.filters.myFilters)\n\n $el.find('.my-filter-name').addClass(\"hidden\")\n $el.find('.save-filters').show()\n\n loadPromise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\", \"Error loading custom filters\")\n\n promise.then null, ->\n currentLoading.finish()\n $el.find(\".my-filter-name\").val(newFilter).focus().select()\n $confirm.notify(\"error\", \"Filter not saved\")\n\n else if event.keyCode == 27\n $el.find('.my-filter-name').val('')\n $el.find('.my-filter-name').addClass(\"hidden\")\n $el.find('.save-filters').show()\n\n return {link:link}\n\nmodule.directive(\"tgIssuesFilters\", [\"$q\", \"$log\", \"$tgLocation\", \"$tgResources\", \"$tgConfirm\", \"$tgLoading\",\n \"$tgTemplate\", \"$translate\", \"$compile\", \"$tgAuth\", IssuesFiltersDirective])\n\n\n#############################################################################\n## Issue status Directive (popover for change status)\n#############################################################################\n\nIssueStatusInlineEditionDirective = ($repo, $template, $rootscope) ->\n ###\n Print the status of an Issue and a popover to change it.\n - tg-issue-status-inline-edition: The issue\n\n Example:\n\n div.status(tg-issue-status-inline-edition=\"issue\")\n a.issue-status(href=\"\")\n\n NOTE: This directive need 'issueStatusById' and 'project'.\n ###\n selectionTemplate = $template.get(\"issue/issue-status-inline-edition-selection.html\", true)\n\n updateIssueStatus = ($el, issue, issueStatusById) ->\n issueStatusDomParent = $el.find(\".issue-status\")\n issueStatusDom = $el.find(\".issue-status .issue-status-bind\")\n\n status = issueStatusById[issue.status]\n\n if status\n issueStatusDom.text(status.name)\n issueStatusDom.prop(\"title\", status.name)\n issueStatusDomParent.css('color', status.color)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n issue = $scope.$eval($attrs.tgIssueStatusInlineEdition)\n\n $el.on \"click\", \".issue-status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n\n for filter in $scope.filters.status\n if filter.id == issue.status\n filter.count--\n\n issue.status = target.data(\"status-id\")\n $el.find(\".pop-status\").popover().close()\n updateIssueStatus($el, issue, $scope.issueStatusById)\n\n $scope.$apply () ->\n $repo.save(issue).then ->\n $ctrl.loadIssues()\n\n for filter in $scope.filters.status\n if filter.id == issue.status\n filter.count++\n\n $rootscope.$broadcast(\"filters:issueupdate\", $scope.filters)\n\n taiga.bindOnce $scope, \"project\", (project) ->\n $el.append(selectionTemplate({ 'statuses': project.issue_statuses }))\n updateIssueStatus($el, issue, $scope.issueStatusById)\n\n # If the user has not enough permissions the click events are unbinded\n if project.my_permissions.indexOf(\"modify_issue\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n $scope.$watch $attrs.tgIssueStatusInlineEdition, (val) =>\n updateIssueStatus($el, val, $scope.issueStatusById)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgIssueStatusInlineEdition\", [\"$tgRepo\", \"$tgTemplate\", \"$rootScope\",\n IssueStatusInlineEditionDirective])\n\n\n#############################################################################\n## Issue assigned to Directive\n#############################################################################\n\nIssueAssignedToInlineEditionDirective = ($repo, $rootscope, popoverService) ->\n template = _.template(\"\"\"\n \" alt=\"<%- name %>\"/>\n
<%- name %>
\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n updateIssue = (issue) ->\n ctx = {name: \"Unassigned\", imgurl: \"/images/unnamed.png\"}\n member = $scope.usersById[issue.assigned_to]\n if member\n ctx.imgurl = member.photo\n ctx.name = member.full_name_display\n\n $el.find(\".avatar\").html(template(ctx))\n $el.find(\".issue-assignedto\").attr('title', ctx.name)\n\n $ctrl = $el.controller()\n issue = $scope.$eval($attrs.tgIssueAssignedToInlineEdition)\n updateIssue(issue)\n\n $el.on \"click\", \".issue-assignedto\", (event) ->\n $rootscope.$broadcast(\"assigned-to:add\", issue)\n\n taiga.bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions the click events are unbinded\n if project.my_permissions.indexOf(\"modify_issue\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n $scope.$on \"assigned-to:added\", (ctx, userId, updatedIssue) =>\n if updatedIssue.id == issue.id\n updatedIssue.assigned_to = userId\n $repo.save(updatedIssue)\n updateIssue(updatedIssue)\n\n $scope.$watch $attrs.tgIssueAssignedToInlineEdition, (val) =>\n updateIssue(val)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgIssueAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\",\n IssueAssignedToInlineEditionDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/userstories/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaUserStories\")\n\n#############################################################################\n## User story Detail Controller\n#############################################################################\n\nclass UserStoryDetailController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$log\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location,\n @log, @appMetaService, @navUrls, @analytics, @translate) ->\n bindMethods(@)\n\n @scope.usRef = @params.usref\n @scope.sectionName = @translate.instant(\"US.SECTION_NAME\")\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n @._setMeta()\n @.initializeOnDeleteGoToUrl()\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n totalTasks = @scope.tasks.length\n closedTasks = _.filter(@scope.tasks, (t) => @scope.taskStatusById[t.status].is_closed).length\n progressPercentage = if totalTasks > 0 then Math.round(100 * closedTasks / totalTasks) else 0\n\n title = @translate.instant(\"US.PAGE_TITLE\", {\n userStoryRef: \"##{@scope.us.ref}\"\n userStorySubject: @scope.us.subject\n projectName: @scope.project.name\n })\n description = @translate.instant(\"US.PAGE_DESCRIPTION\", {\n userStoryStatus: @scope.statusById[@scope.us.status]?.name or \"--\"\n userStoryPoints: @scope.us.total_points\n userStoryDescription: angular.element(@scope.us.description_html or \"\").text()\n userStoryClosedTasks: closedTasks\n userStoryTotalTasks: totalTasks\n userStoryProgressPercentage: progressPercentage\n })\n\n @appMetaService.setAll(title, description)\n\n initializeEventHandlers: ->\n @scope.$on \"related-tasks:update\", =>\n @scope.tasks = _.clone(@scope.tasks, false)\n\n @scope.$on \"attachment:create\", =>\n @analytics.trackEvent(\"attachment\", \"create\", \"create attachment on userstory\", 1)\n\n @scope.$on \"comment:new\", =>\n @.loadUs()\n\n initializeOnDeleteGoToUrl: ->\n ctx = {project: @scope.project.slug}\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project\", ctx)\n if @scope.project.is_backlog_activated\n if @scope.us.milestone\n ctx.sprint = @scope.sprint.slug\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-taskboard\", ctx)\n else\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-backlog\", ctx)\n else if @scope.project.is_kanban_activated\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-kanban\", ctx)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.statusList = project.us_statuses\n @scope.statusById = groupBy(project.us_statuses, (x) -> x.id)\n @scope.taskStatusById = groupBy(project.task_statuses, (x) -> x.id)\n @scope.pointsList = _.sortBy(project.points, \"order\")\n @scope.pointsById = groupBy(@scope.pointsList, (e) -> e.id)\n return project\n\n loadUs: ->\n httpParams = _.pick(@location.search(), \"milestone\", \"no-milestone\", \"kanban-status\")\n milestone = httpParams.milestone\n if milestone\n @rs.userstories.storeQueryParams(@scope.projectId, {\n milestone: milestone\n order_by: \"sprint_order\"\n })\n\n noMilestone = httpParams[\"no-milestone\"]\n if noMilestone\n @rs.userstories.storeQueryParams(@scope.projectId, {\n milestone: \"null\"\n order_by: \"backlog_order\"\n })\n\n kanbanStaus = httpParams[\"kanban-status\"]\n if kanbanStaus\n @rs.userstories.storeQueryParams(@scope.projectId, {\n status: kanbanStaus\n order_by: \"kanban_order\"\n })\n\n\n\n return @rs.userstories.getByRef(@scope.projectId, @params.usref).then (us) =>\n @scope.us = us\n @scope.usId = us.id\n @scope.commentModel = us\n\n if @scope.us.neighbors.previous.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.us.neighbors.previous.ref\n }\n @scope.previousUrl = @navUrls.resolve(\"project-userstories-detail\", ctx)\n\n if @scope.us.neighbors.next.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.us.neighbors.next.ref\n }\n @scope.nextUrl = @navUrls.resolve(\"project-userstories-detail\", ctx)\n\n return us\n\n loadSprint: ->\n if @scope.us.milestone\n return @rs.sprints.get(@scope.us.project, @scope.us.milestone).then (sprint) =>\n @scope.sprint = sprint\n return sprint\n\n loadTasks: ->\n return @rs.tasks.list(@scope.projectId, null, @scope.usId).then (tasks) =>\n @scope.tasks = tasks\n return tasks\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.loadUs().then(=> @q.all([@.loadSprint(), @.loadTasks()]))\n\n ###\n # Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n # See app/modules/components/vote-button for more info\n ###\n onUpvote: ->\n onSuccess = =>\n @.loadUs()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.userstories.upvote(@scope.usId).then(onSuccess, onError)\n\n onDownvote: ->\n onSuccess = =>\n @.loadUs()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.userstories.downvote(@scope.usId).then(onSuccess, onError)\n\n ###\n # Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n # See app/modules/components/watch-button for more info\n ###\n onWatch: ->\n onSuccess = =>\n @.loadUs()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.userstories.watch(@scope.usId).then(onSuccess, onError)\n\n onUnwatch: ->\n onSuccess = =>\n @.loadUs()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.userstories.unwatch(@scope.usId).then(onSuccess, onError)\n\nmodule.controller(\"UserStoryDetailController\", UserStoryDetailController)\n\n\n#############################################################################\n## User story status display directive\n#############################################################################\n\nUsStatusDisplayDirective = ($template, $compile) ->\n # Display if a US is open or closed and its kanban status.\n #\n # Example:\n # tg-us-status-display(ng-model=\"us\")\n #\n # Requirements:\n # - US object (ng-model)\n # - scope.statusById object\n\n template = $template.get(\"common/components/status-display.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (us) ->\n status = $scope.statusById[us.status]\n\n html = template({\n is_closed: us.is_closed\n status: status\n })\n\n html = $compile(html)($scope)\n $el.html(html)\n\n $scope.$watch $attrs.ngModel, (us) ->\n render(us) if us?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsStatusDisplay\", [\"$tgTemplate\", \"$compile\", UsStatusDisplayDirective])\n\n\n#############################################################################\n## User story related tasts progress splay Directive\n#############################################################################\n\nUsTasksProgressDisplayDirective = ($template, $compile) ->\n # Display a progress bar with the stats of completed tasks.\n #\n # Example:\n # tg-us-tasks-progress-display(ng-model=\"tasks\")\n #\n # Requirements:\n # - Task object list (ng-model)\n # - scope.taskStatusById object\n\n link = ($scope, $el, $attrs) ->\n render = (tasks) ->\n totalTasks = tasks.length\n totalClosedTasks = _.filter(tasks, (task) => $scope.taskStatusById[task.status].is_closed).length\n\n progress = if totalTasks > 0 then 100 * totalClosedTasks / totalTasks else 0\n\n _.assign($scope, {\n totalTasks: totalTasks\n totalClosedTasks: totalClosedTasks\n progress: progress,\n style: {\n width: progress + \"%\"\n }\n })\n\n $scope.$watch $attrs.ngModel, (tasks) ->\n render(tasks) if tasks?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n templateUrl: \"us/us-task-progress.html\"\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n scope: true\n }\n\nmodule.directive(\"tgUsTasksProgressDisplay\", [\"$tgTemplate\", \"$compile\", UsTasksProgressDisplayDirective])\n\n\n#############################################################################\n## User story status button directive\n#############################################################################\n\nUsStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template) ->\n # Display the status of a US and you can edit it.\n #\n # Example:\n # tg-us-status-button(ng-model=\"us\")\n #\n # Requirements:\n # - Us object (ng-model)\n # - scope.statusById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"us/us-status-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_us\") != -1\n\n render = (us) =>\n status = $scope.statusById[us.status]\n\n html = template({\n status: status\n statuses: $scope.statusList\n editable: isEditable()\n })\n\n $el.html(html)\n\n save = $qqueue.bindAdd (status) =>\n us = $model.$modelValue.clone()\n\n us.status = status\n\n $.fn.popover().closeAll()\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(us)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n\n onError = ->\n $confirm.notify(\"error\")\n currentLoading.finish()\n\n $repo.save(us).then(onSuccess, onError)\n\n $el.on \"click\", \".status-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n status = target.data(\"status-id\")\n\n save(status)\n\n $scope.$watch $attrs.ngModel, (us) ->\n render(us) if us\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\",\"$tgQqueue\", \"$tgTemplate\",\n UsStatusButtonDirective])\n\n\n#############################################################################\n## User story team requirements button directive\n#############################################################################\n\nUsTeamRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) ->\n template = $template.get(\"us/us-team-requirement-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n canEdit = ->\n return $scope.project.my_permissions.indexOf(\"modify_us\") != -1\n\n render = (us) ->\n if not canEdit() and not us.team_requirement\n $el.html(\"\")\n return\n\n ctx = {\n canEdit: canEdit()\n isRequired: us.team_requirement\n }\n html = template(ctx)\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (team_requirement) =>\n us = $model.$modelValue.clone()\n us.team_requirement = team_requirement\n\n currentLoading = $loading()\n .target($el.find(\"label\"))\n .start()\n\n promise = $tgrepo.save(us)\n promise.then =>\n $model.$setViewValue(us)\n currentLoading.finish()\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n $el.on \"click\", \".team-requirement\", (event) ->\n return if not canEdit()\n\n team_requirement = not $model.$modelValue.team_requirement\n\n save(team_requirement)\n\n $scope.$watch $attrs.ngModel, (us) ->\n render(us) if us\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsTeamRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", UsTeamRequirementButtonDirective])\n\n#############################################################################\n## User story client requirements button directive\n#############################################################################\n\nUsClientRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) ->\n template = $template.get(\"us/us-client-requirement-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n canEdit = ->\n return $scope.project.my_permissions.indexOf(\"modify_us\") != -1\n\n render = (us) ->\n if not canEdit() and not us.client_requirement\n $el.html(\"\")\n return\n\n ctx = {\n canEdit: canEdit()\n isRequired: us.client_requirement\n }\n html = $compile(template(ctx))($scope)\n $el.html(html)\n\n save = $qqueue.bindAdd (client_requirement) =>\n us = $model.$modelValue.clone()\n us.client_requirement = client_requirement\n\n currentLoading = $loading()\n .target($el.find(\"label\"))\n .start()\n\n promise = $tgrepo.save(us)\n promise.then =>\n $model.$setViewValue(us)\n currentLoading.finish()\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n $confirm.notify(\"error\")\n\n $el.on \"click\", \".client-requirement\", (event) ->\n return if not canEdit()\n\n client_requirement = not $model.$modelValue.client_requirement\n save(client_requirement)\n\n $scope.$watch $attrs.ngModel, (us) ->\n render(us) if us\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsClientRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\",\n UsClientRequirementButtonDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/tasks/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaTasks\")\n\n\n#############################################################################\n## Task Detail Controller\n#############################################################################\n\nclass TaskDetailController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$log\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location,\n @log, @appMetaService, @navUrls, @analytics, @translate) ->\n bindMethods(@)\n\n @scope.taskRef = @params.taskref\n @scope.sectionName = @translate.instant(\"TASK.SECTION_NAME\")\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n promise.then () =>\n @._setMeta()\n @.initializeOnDeleteGoToUrl()\n\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n title = @translate.instant(\"TASK.PAGE_TITLE\", {\n taskRef: \"##{@scope.task.ref}\"\n taskSubject: @scope.task.subject\n projectName: @scope.project.name\n })\n description = @translate.instant(\"TASK.PAGE_DESCRIPTION\", {\n taskStatus: @scope.statusById[@scope.task.status]?.name or \"--\"\n taskDescription: angular.element(@scope.task.description_html or \"\").text()\n })\n @appMetaService.setAll(title, description)\n\n initializeEventHandlers: ->\n @scope.$on \"attachment:create\", =>\n @analytics.trackEvent(\"attachment\", \"create\", \"create attachment on task\", 1)\n @scope.$on \"custom-attributes-values:edit\", =>\n @rootscope.$broadcast(\"object:updated\")\n @scope.$on \"comment:new\", =>\n @.loadTask()\n\n initializeOnDeleteGoToUrl: ->\n ctx = {project: @scope.project.slug}\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project\", ctx)\n if @scope.project.is_backlog_activated\n if @scope.task.milestone\n ctx.sprint = @scope.sprint.slug\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-taskboard\", ctx)\n else if @scope.task.us\n ctx.ref = @scope.us.ref\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-userstories-detail\", ctx)\n else if @scope.project.is_kanban_activated\n if @scope.us\n ctx.ref = @scope.us.ref\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-userstories-detail\", ctx)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.statusList = project.task_statuses\n @scope.statusById = groupBy(project.task_statuses, (x) -> x.id)\n return project\n\n loadTask: ->\n return @rs.tasks.getByRef(@scope.projectId, @params.taskref).then (task) =>\n @scope.task = task\n @scope.taskId = task.id\n @scope.commentModel = task\n\n if @scope.task.neighbors.previous.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.task.neighbors.previous.ref\n }\n @scope.previousUrl = @navUrls.resolve(\"project-tasks-detail\", ctx)\n\n if @scope.task.neighbors.next.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.task.neighbors.next.ref\n }\n @scope.nextUrl = @navUrls.resolve(\"project-tasks-detail\", ctx)\n return task\n\n loadSprint: ->\n if @scope.task.milestone\n return @rs.sprints.get(@scope.task.project, @scope.task.milestone).then (sprint) =>\n @scope.sprint = sprint\n return sprint\n\n loadUserStory: ->\n if @scope.task.user_story\n return @rs.userstories.get(@scope.task.project, @scope.task.user_story).then (us) =>\n @scope.us = us\n return us\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.loadTask().then(=> @q.all([@.loadSprint(), @.loadUserStory()]))\n\n ###\n # Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n # See app/modules/components/vote-button for more info\n ###\n onUpvote: ->\n onSuccess = =>\n @.loadTask()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.tasks.upvote(@scope.taskId).then(onSuccess, onError)\n\n onDownvote: ->\n onSuccess = =>\n @.loadTask()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.tasks.downvote(@scope.taskId).then(onSuccess, onError)\n\n ###\n # Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n # See app/modules/components/watch-button for more info\n ###\n onWatch: ->\n onSuccess = =>\n @.loadTask()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.tasks.watch(@scope.taskId).then(onSuccess, onError)\n\n onUnwatch: ->\n onSuccess = =>\n @.loadTask()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.tasks.unwatch(@scope.taskId).then(onSuccess, onError)\n\nmodule.controller(\"TaskDetailController\", TaskDetailController)\n\n\n#############################################################################\n## Task status display directive\n#############################################################################\n\nTaskStatusDisplayDirective = ($template, $compile) ->\n # Display if a Task is open or closed and its taskboard status.\n #\n # Example:\n # tg-task-status-display(ng-model=\"task\")\n #\n # Requirements:\n # - Task object (ng-model)\n # - scope.statusById object\n\n template = $template.get(\"common/components/status-display.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (task) ->\n status = $scope.statusById[task.status]\n\n html = template({\n is_closed: status.is_closed\n status: status\n })\n\n html = $compile(html)($scope)\n $el.html(html)\n\n $scope.$watch $attrs.ngModel, (task) ->\n render(task) if task?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgTaskStatusDisplay\", [\"$tgTemplate\", \"$compile\", TaskStatusDisplayDirective])\n\n\n#############################################################################\n## Task status button directive\n#############################################################################\n\nTaskStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $compile, $translate, $template) ->\n # Display the status of Task and you can edit it.\n #\n # Example:\n # tg-task-status-button(ng-model=\"task\")\n #\n # Requirements:\n # - Task object (ng-model)\n # - scope.statusById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"us/us-status-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_task\") != -1\n\n render = (task) =>\n status = $scope.statusById[task.status]\n\n html = $compile(template({\n status: status\n statuses: $scope.statusList\n editable: isEditable()\n }))($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (status) =>\n task = $model.$modelValue.clone()\n task.status = status\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $model.$setViewValue(task)\n $confirm.notify(\"success\")\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n\n onError = ->\n $confirm.notify(\"error\")\n currentLoading.finish()\n\n $repo.save(task).then(onSuccess, onError)\n\n $el.on \"click\", \".status-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n\n $.fn.popover().closeAll()\n\n save(target.data(\"status-id\"))\n\n $scope.$watch $attrs.ngModel, (task) ->\n render(task) if task\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgTaskStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\",\n \"$compile\", \"$translate\", \"$tgTemplate\", TaskStatusButtonDirective])\n\n\nTaskIsIocaineButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $compile) ->\n template = _.template(\"\"\"\n
\n \n \n
\n \"\"\")\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_task\") != -1\n\n render = (task) ->\n if not isEditable() and not task.is_iocaine\n $el.html(\"\")\n return\n\n ctx = {\n isIocaine: task.is_iocaine\n isEditable: isEditable()\n }\n html = $compile(template(ctx))($scope)\n $el.html(html)\n\n save = $qqueue.bindAdd (is_iocaine) =>\n task = $model.$modelValue.clone()\n task.is_iocaine = is_iocaine\n\n currentLoading = $loading()\n .target($el.find('label'))\n .start()\n\n promise = $tgrepo.save(task)\n\n promise.then ->\n $model.$setViewValue(task)\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n $confirm.notify(\"error\")\n\n promise.finally ->\n currentLoading.finish()\n\n $el.on \"click\", \".is-iocaine\", (event) ->\n return if not isEditable()\n\n is_iocaine = not $model.$modelValue.is_iocaine\n save(is_iocaine)\n\n $scope.$watch $attrs.ngModel, (task) ->\n render(task) if task\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgTaskIsIocaineButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\",\n \"$compile\", TaskIsIocaineButtonDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/team/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\n\nmodule = angular.module(\"taigaTeam\")\n\n#############################################################################\n## Team Controller\n#############################################################################\n\nclass TeamController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$location\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$tgAuth\",\n \"$translate\",\n \"tgProjectService\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @rs, @params, @q, @location, @navUrls, @appMetaService, @auth,\n @translate, @projectService) ->\n @scope.sectionName = \"TEAM.SECTION_NAME\"\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n title = @translate.instant(\"TEAM.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"TEAM.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n setRole: (role) ->\n if role\n @scope.filtersRole = role\n else\n @scope.filtersRole = null\n\n loadMembers: ->\n user = @auth.getUser()\n\n # Calculate totals\n @scope.totals = {}\n for member in @scope.activeUsers\n @scope.totals[member.id] = 0\n\n # Get current user\n @scope.currentUser = _.find(@scope.activeUsers, {id: user?.id})\n\n # Get member list without current user\n @scope.memberships = _.reject(@scope.activeUsers, {id: user?.id})\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n\n @scope.issuesEnabled = project.is_issues_activated\n @scope.tasksEnabled = project.is_kanban_activated or project.is_backlog_activated\n @scope.wikiEnabled = project.is_wiki_activated\n\n return project\n\n loadMemberStats: ->\n return @rs.projects.memberStats(@scope.projectId).then (stats) =>\n totals = {}\n _.forEach @scope.totals, (total, userId) =>\n vals = _.map(stats, (memberStats, statsKey) -> memberStats[userId])\n total = _.reduce(vals, (sum, el) -> sum + el)\n @scope.totals[userId] = total\n\n @scope.stats = @._processStats(stats)\n @scope.stats.totals = @scope.totals\n\n _processStat: (stat) ->\n max = _.max(stat)\n min = _.min(stat)\n singleStat = _.map stat, (value, key) ->\n if value == min\n return [key, 0.1]\n if value == max\n return [key, 1]\n return [key, (value * 0.5) / max]\n singleStat = _.object(singleStat)\n return singleStat\n\n _processStats: (stats) ->\n for key,value of stats\n stats[key] = @._processStat(value)\n return stats\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.loadMembers()\n return @.loadMemberStats()\n\nmodule.controller(\"TeamController\", TeamController)\n\n\n#############################################################################\n## Team Filters Directive\n#############################################################################\n\nTeamFiltersDirective = () ->\n return {\n templateUrl: \"team/team-filter.html\"\n }\n\nmodule.directive(\"tgTeamFilters\", [TeamFiltersDirective])\n\n\n#############################################################################\n## Team Member Stats Directive\n#############################################################################\n\nTeamMemberStatsDirective = () ->\n return {\n templateUrl: \"team/team-member-stats.html\",\n scope: {\n stats: \"=\",\n userId: \"=user\"\n issuesEnabled: \"=issuesenabled\"\n tasksEnabled: \"=tasksenabled\"\n wikiEnabled: \"=wikienabled\"\n }\n }\n\nmodule.directive(\"tgTeamMemberStats\", TeamMemberStatsDirective)\n\n\n#############################################################################\n## Team Current User Directive\n#############################################################################\n\nTeamMemberCurrentUserDirective = () ->\n return {\n templateUrl: \"team/team-member-current-user.html\"\n scope: {\n projectId: \"=projectid\",\n currentUser: \"=currentuser\",\n stats: \"=\"\n issuesEnabled: \"=issuesenabled\"\n tasksEnabled: \"=tasksenabled\"\n wikiEnabled: \"=wikienabled\"\n }\n }\n\nmodule.directive(\"tgTeamCurrentUser\", TeamMemberCurrentUserDirective)\n\n\n#############################################################################\n## Team Members Directive\n#############################################################################\n\nTeamMembersDirective = () ->\n template = \"team/team-members.html\"\n\n return {\n templateUrl: template\n scope: {\n memberships: \"=\",\n filtersQ: \"=filtersq\",\n filtersRole: \"=filtersrole\",\n stats: \"=\"\n issuesEnabled: \"=issuesenabled\"\n tasksEnabled: \"=tasksenabled\"\n wikiEnabled: \"=wikienabled\"\n }\n }\n\nmodule.directive(\"tgTeamMembers\", TeamMembersDirective)\n\n\n#############################################################################\n## Leave project Directive\n#############################################################################\n\nLeaveProjectDirective = ($repo, $confirm, $location, $rs, $navurls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $scope.leave = () ->\n leave_project_text = $translate.instant(\"TEAM.ACTION_LEAVE_PROJECT\")\n confirm_leave_project_text = $translate.instant(\"TEAM.CONFIRM_LEAVE_PROJECT\")\n\n $confirm.ask(leave_project_text, confirm_leave_project_text).then (response) =>\n promise = $rs.projects.leave($attrs.projectid)\n\n promise.then =>\n response.finish()\n $confirm.notify(\"success\")\n $location.path($navurls.resolve(\"home\"))\n\n promise.then null, (response) ->\n response.finish()\n $confirm.notify('error', response.data._error_message)\n\n return {\n scope: {},\n templateUrl: \"team/leave-project.html\",\n link: link\n }\n\nmodule.directive(\"tgLeaveProject\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgResources\", \"$tgNavUrls\", \"$translate\",\n LeaveProjectDirective])\n\n\n#############################################################################\n## Team Filters\n#############################################################################\n\nmembersFilter = ->\n return (members, filtersQ, filtersRole) ->\n return _.filter members, (m) -> (not filtersRole or m.role == filtersRole.id) and\n (not filtersQ or m.full_name.search(new RegExp(filtersQ, \"i\")) >= 0)\n\nmodule.filter('membersFilter', membersFilter)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/wiki/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaWiki\")\n\n#############################################################################\n## Wiki Detail Controller\n#############################################################################\n\nclass WikiDetailController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgModel\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$filter\",\n \"$log\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @model, @confirm, @rs, @params, @q, @location,\n @filter, @log, @appMetaService, @navUrls, @analytics, @translate) ->\n @scope.projectSlug = @params.pslug\n @scope.wikiSlug = @params.slug\n @scope.wikiTitle = @scope.wikiSlug\n @scope.sectionName = \"Wiki\"\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then () => @._setMeta()\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n title = @translate.instant(\"WIKI.PAGE_TITLE\", {\n wikiPageName: @scope.wikiTitle\n projectName: @scope.project.name\n })\n description = @translate.instant(\"WIKI.PAGE_DESCRIPTION\", {\n wikiPageContent: angular.element(@scope.wiki.html or \"\").text()\n totalEditions: @scope.wiki.editions or 0\n lastModifiedDate: moment(@scope.wiki.modified_date).format(@translate.instant(\"WIKI.DATETIME\"))\n })\n @appMetaService.setAll(title, description)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.is_wiki_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadWiki: ->\n promise = @rs.wiki.getBySlug(@scope.projectId, @params.slug)\n promise.then (wiki) =>\n @scope.wiki = wiki\n @scope.wikiId = wiki.id\n return @scope.wiki\n\n promise.then null, (xhr) =>\n @scope.wikiId = null\n\n if @scope.project.my_permissions.indexOf(\"add_wiki_page\") == -1\n return null\n\n data = {\n project: @scope.projectId\n slug: @scope.wikiSlug\n content: \"\"\n }\n @scope.wiki = @model.make_model(\"wiki\", data)\n return @scope.wiki\n\n loadWikiLinks: ->\n return @rs.wiki.listLinks(@scope.projectId).then (wikiLinks) =>\n @scope.wikiLinks = wikiLinks\n selectedWikiLink = _.find(wikiLinks, {href: @scope.wikiSlug})\n @scope.wikiTitle = selectedWikiLink.title if selectedWikiLink?\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @q.all([@.loadWikiLinks(), @.loadWiki()]).then () =>\n\n\n delete: ->\n title = @translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\")\n message = @scope.wikiTitle\n\n @confirm.askOnDelete(title, message).then (askResponse) =>\n onSuccess = =>\n askResponse.finish()\n ctx = {project: @scope.projectSlug}\n @location.path(@navUrls.resolve(\"project-wiki\", ctx))\n @confirm.notify(\"success\")\n\n onError = =>\n askResponse.finish(false)\n @confirm.notify(\"error\")\n\n @repo.remove(@scope.wiki).then onSuccess, onError\n\nmodule.controller(\"WikiDetailController\", WikiDetailController)\n\n\n#############################################################################\n## Wiki Summary Directive\n#############################################################################\n\nWikiSummaryDirective = ($log, $template, $compile, $translate) ->\n template = $template.get(\"wiki/wiki-summary.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n render = (wiki) ->\n if not $scope.usersById?\n $log.error \"WikiSummaryDirective requires userById set in scope.\"\n else\n user = $scope.usersById[wiki.last_modifier]\n\n if user is undefined\n user = {name: \"unknown\", imgUrl: \"/images/user-noimage.png\"}\n else\n user = {name: user.full_name_display, imgUrl: user.photo}\n\n ctx = {\n totalEditions: wiki.editions\n lastModifiedDate: moment(wiki.modified_date).format($translate.instant(\"WIKI.DATETIME\"))\n user: user\n }\n html = template(ctx)\n html = $compile(html)($scope)\n $el.html(html)\n\n $scope.$watch $attrs.ngModel, (wikiPage) ->\n return if not wikiPage\n render(wikiPage)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgWikiSummary\", [\"$log\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiSummaryDirective])\n\n\n#############################################################################\n## Editable Wiki Content Directive\n#############################################################################\n\nEditableWikiContentDirective = ($window, $document, $repo, $confirm, $loading, $analytics, $qqueue) ->\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_wiki_page\") != -1\n\n switchToEditMode = ->\n $el.find('.edit-wiki-content').show()\n $el.find('.view-wiki-content').hide()\n $el.find('textarea').focus()\n\n switchToReadMode = ->\n $el.find('.edit-wiki-content').hide()\n $el.find('.view-wiki-content').show()\n\n disableEdition = ->\n $el.find(\".view-wiki-content .edit\").remove()\n $el.find(\".edit-wiki-content\").remove()\n\n cancelEdition = ->\n return if not $model.$modelValue.id\n\n $scope.$apply () =>\n $model.$modelValue.revert()\n switchToReadMode()\n\n getSelectedText = ->\n if $window.getSelection\n return $window.getSelection().toString()\n else if $document.selection\n return $document.selection.createRange().text\n return null\n\n save = $qqueue.bindAdd (wiki) ->\n onSuccess = (wikiPage) ->\n if not wiki.id?\n $analytics.trackEvent(\"wikipage\", \"create\", \"create wiki page\", 1)\n\n $model.$setViewValue wikiPage.clone()\n\n $confirm.notify(\"success\")\n switchToReadMode()\n\n onError = ->\n $confirm.notify(\"error\")\n\n currentLoading = $loading()\n .removeClasses(\"icon-floppy\")\n .target($el.find('.icon-floppy'))\n .start()\n\n if wiki.id?\n promise = $repo.save(wiki).then(onSuccess, onError)\n else\n promise = $repo.create(\"wiki\", wiki).then(onSuccess, onError)\n\n promise.finally ->\n currentLoading.finish()\n\n $el.on \"click\", \"a\", (event) ->\n target = angular.element(event.target)\n href = target.attr('href')\n if href.indexOf(\"#\") == 0\n event.preventDefault()\n $('body').scrollTop($(href).offset().top)\n\n $el.on \"mousedown\", \".view-wiki-content\", (event) ->\n target = angular.element(event.target)\n return if not isEditable()\n return if event.button == 2\n\n $el.on \"mouseup\", \".view-wiki-content\", (event) ->\n target = angular.element(event.target)\n return if getSelectedText()\n return if not isEditable()\n return if target.is('a')\n return if target.is('pre')\n\n switchToEditMode()\n\n $el.on \"click\", \".save\", debounce 2000, ->\n save($scope.wiki)\n\n $el.on \"click\", \".cancel\", ->\n cancelEdition()\n\n $el.on \"keydown\", \"textarea\", (event) ->\n if event.keyCode == 27\n cancelEdition()\n\n $scope.$watch $attrs.ngModel, (wikiPage) ->\n return if not wikiPage\n\n if isEditable()\n $el.addClass('editable')\n if not wikiPage.id? or $.trim(wikiPage.content).length == 0\n switchToEditMode()\n else\n disableEdition()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n templateUrl: \"wiki/editable-wiki-content.html\"\n }\n\nmodule.directive(\"tgEditableWikiContent\", [\"$window\", \"$document\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\",\n \"$tgAnalytics\", \"$tgQqueue\", EditableWikiContentDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/wiki/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaWiki\")\n\n\n#############################################################################\n## Wiki Main Directive\n#############################################################################\n\nWikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $loading, $template, $compile, $translate) ->\n template = $template.get(\"wiki/wiki-nav.html\", true)\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n if not $attrs.ngModel?\n return $log.error \"WikiNavDirective: no ng-model attr is defined\"\n\n render = (wikiLinks) ->\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1\n deleteWikiLinkPermission = $scope.project.my_permissions.indexOf(\"delete_wiki_link\") > -1\n\n html = template({\n wikiLinks: wikiLinks,\n projectSlug: $scope.projectSlug\n addWikiLinkPermission: addWikiLinkPermission\n deleteWikiLinkPermission: deleteWikiLinkPermission\n })\n\n html = $compile(html)($scope)\n\n $el.off()\n $el.html(html)\n\n $el.on \"click\", \".wiki-link .link-title\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n linkId = target.parents('.wiki-link').data('id')\n linkSlug = $scope.wikiLinks[linkId].href\n $scope.$apply ->\n ctx = {\n project: $scope.projectSlug\n slug: linkSlug\n }\n $location.path($navUrls.resolve(\"project-wiki-page\", ctx))\n\n $el.on \"click\", \".add-button\", (event) ->\n event.preventDefault()\n $el.find(\".new\").removeClass(\"hidden\")\n $el.find(\".new input\").focus()\n $el.find(\".add-button\").hide()\n\n $el.on \"click\", \".wiki-link .icon-delete\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n linkId = target.parents('.wiki-link').data('id')\n\n title = $translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\")\n message = $scope.wikiLinks[linkId].title\n\n $confirm.askOnDelete(title, message).then (askResponse) =>\n promise = $tgrepo.remove($scope.wikiLinks[linkId])\n promise.then ->\n promise = $ctrl.loadWikiLinks()\n promise.then ->\n askResponse.finish()\n render($scope.wikiLinks)\n promise.then null, ->\n askResponse.finish()\n promise.then null, ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n $el.on \"keyup\", \".new input\", (event) ->\n event.preventDefault()\n if event.keyCode == 13\n target = angular.element(event.currentTarget)\n newLink = target.val()\n\n currentLoading = $loading()\n .target($el.find(\".new\"))\n .start()\n\n promise = $tgrepo.create(\"wiki-links\", {project: $scope.projectId, title: newLink})\n promise.then ->\n $analytics.trackEvent(\"wikilink\", \"create\", \"create wiki link\", 1)\n loadPromise = $ctrl.loadWikiLinks()\n loadPromise.then ->\n currentLoading.finish()\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new input\").val('')\n $el.find(\".add-button\").show()\n render($scope.wikiLinks)\n loadPromise.then null, ->\n currentLoading.finish()\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new input\").val('')\n $el.find(\".add-button\").show()\n $confirm.notify(\"error\", \"Error loading wiki links\")\n\n promise.then null, (error) ->\n currentLoading.finish()\n $el.find(\".new input\").val(newLink)\n $el.find(\".new input\").focus().select()\n if error?.__all__?[0]?\n $confirm.notify(\"error\", \"The link already exists\")\n else\n $confirm.notify(\"error\")\n\n else if event.keyCode == 27\n target = angular.element(event.currentTarget)\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new input\").val('')\n $el.find(\".add-button\").show()\n\n\n bindOnce($scope, $attrs.ngModel, render)\n\n return {link:link}\n\nmodule.directive(\"tgWikiNav\", [\"$tgRepo\", \"$log\", \"$tgLocation\", \"$tgConfirm\", \"$tgNavUrls\",\n \"$tgAnalytics\", \"$tgLoading\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiNavDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/lightboxes.coffee\n###\n\ntaiga = @.taiga\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaKanban\")\n\nMAX_MEMBERSHIP_FIELDSETS = 4\n\n#############################################################################\n## Create Members Lightbox Directive\n#############################################################################\n\nCreateMembersDirective = ($rs, $rootScope, $confirm, $loading, lightboxService, $compile) ->\n extraTextTemplate = \"\"\"\n
\n \n
\n \"\"\"\n\n template = _.template(\"\"\"\n
\n
\n data-required=\"true\" <% } %> data-type=\"email\" />\n
\n
\n \n \n
\n
\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n createFieldSet = (required = true)->\n ctx = {roleList: $scope.project.roles, required: required}\n return $compile(template(ctx))($scope)\n\n resetForm = ->\n $el.find(\"form textarea\").remove()\n $el.find(\"form .add-member-wrapper\").remove()\n\n invitations = $el.find(\".add-member-forms\")\n invitations.html($compile(extraTextTemplate)($scope))\n\n fieldSet = createFieldSet()\n invitations.prepend(fieldSet)\n\n $scope.$on \"membersform:new\", ->\n resetForm()\n lightboxService.open($el)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $el.on \"click\", \".delete-fieldset\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n fieldSet = target.closest('.add-member-wrapper')\n\n fieldSet.remove()\n\n lastActionButton = $el.find(\".add-member-wrapper fieldset:last > a\")\n if lastActionButton.hasClass(\"icon-delete delete-fieldset\")\n lastActionButton.removeClass(\"icon-delete delete-fieldset\")\n .addClass(\"icon-plus add-fieldset\")\n\n $el.on \"click\", \".add-fieldset\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n fieldSet = target.closest('.add-member-wrapper')\n\n target.removeClass(\"icon-plus add-fieldset\")\n .addClass(\"icon-delete delete-fieldset\")\n\n newFieldSet = createFieldSet(false)\n fieldSet.after(newFieldSet)\n\n $scope.$digest() # To compile newFieldSet and translate text\n\n if $el.find(\".add-member-wrapper\").length == MAX_MEMBERSHIP_FIELDSETS\n $el.find(\".add-member-wrapper fieldset:last > a\").removeClass(\"icon-plus add-fieldset\")\n .addClass(\"icon-delete delete-fieldset\")\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n onSuccess = (data) ->\n currentLoading.finish()\n lightboxService.close($el)\n $confirm.notify(\"success\")\n $rootScope.$broadcast(\"membersform:new:success\")\n\n onError = (data) ->\n currentLoading.finish()\n lightboxService.close($el)\n $confirm.notify(\"error\")\n $rootScope.$broadcast(\"membersform:new:error\")\n\n form = $el.find(\"form\").checksley()\n\n #checksley find new fields\n form.destroy()\n form.initialize()\n if not form.validate()\n return\n\n memberWrappers = $el.find(\"form .add-member-wrapper\")\n memberWrappers = _.filter memberWrappers, (mw) ->\n angular.element(mw).find(\"input\").hasClass('checksley-ok')\n\n invitations = _.map memberWrappers, (mw) ->\n memberWrapper = angular.element(mw)\n email = memberWrapper.find(\"input\")\n role = memberWrapper.find(\"select\")\n\n return {\n email: email.val()\n role_id: role.val()\n }\n\n if invitations.length\n invitation_extra_text = $el.find(\"form textarea\").val()\n\n promise = $rs.memberships.bulkCreateMemberships($scope.project.id,\n invitations, invitation_extra_text)\n promise.then(onSuccess, onError)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link: link}\n\nmodule.directive(\"tgLbCreateMembers\", [\"$tgResources\", \"$rootScope\", \"$tgConfirm\", \"$tgLoading\",\n \"lightboxService\", \"$compile\", CreateMembersDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/memberships.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaAdmin\")\n\n\n#############################################################################\n## Project Memberships Controller\n#############################################################################\n\nclass MembershipsController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"$tgAnalytics\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @analytics,\n @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.project = {}\n @scope.filters = {}\n\n promise = @.loadInitialData()\n\n promise.then =>\n title = @translate.instant(\"ADMIN.MEMBERSHIPS.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"membersform:new:success\", =>\n @.loadMembers()\n @analytics.trackEvent(\"membership\", \"create\", \"create memberships on admin\", 1)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadMembers: ->\n httpFilters = @.getUrlFilters()\n return @rs.memberships.list(@scope.projectId, httpFilters).then (data) =>\n @scope.memberships = _.filter(data.models, (membership) ->\n membership.user == null or membership.is_user_active)\n\n @scope.page = data.current\n @scope.count = data.count\n @scope.paginatedBy = data.paginatedBy\n return data\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then =>\n @.loadMembers()\n\n return promise\n\n getUrlFilters: ->\n filters = _.pick(@location.search(), \"page\")\n filters.page = 1 if not filters.page\n return filters\n\n addNewMembers: ->\n @rootscope.$broadcast(\"membersform:new\")\n\n\nmodule.controller(\"MembershipsController\", MembershipsController)\n\n\n#############################################################################\n## Member Avatar Directive\n#############################################################################\n\nMembershipsDirective = ($template, $compile) ->\n template = $template.get(\"admin/admin-membership-paginator.html\", true)\n\n linkPagination = ($scope, $el, $attrs, $ctrl) ->\n # Constants\n afterCurrent = 2\n beforeCurrent = 4\n atBegin = 2\n atEnd = 2\n\n $pagEl = $el.find(\".memberships-paginator\")\n\n getNumPages = ->\n numPages = $scope.count / $scope.paginatedBy\n if parseInt(numPages, 10) < numPages\n numPages = parseInt(numPages, 10) + 1\n else\n numPages = parseInt(numPages, 10)\n\n return numPages\n\n renderPagination = ->\n numPages = getNumPages()\n\n if numPages <= 1\n $pagEl.hide()\n return\n\n pages = []\n options = {}\n options.pages = pages\n options.showPrevious = ($scope.page > 1)\n options.showNext = not ($scope.page == numPages)\n\n cpage = $scope.page\n\n for i in [1..numPages]\n if i == (cpage + afterCurrent) and numPages > (cpage + afterCurrent + atEnd)\n pages.push({classes: \"dots\", type: \"dots\"})\n else if i == (cpage - beforeCurrent) and cpage > (atBegin + beforeCurrent)\n pages.push({classes: \"dots\", type: \"dots\"})\n else if i > (cpage + afterCurrent) and i <= (numPages - atEnd)\n else if i < (cpage - beforeCurrent) and i > atBegin\n else if i == cpage\n pages.push({classes: \"active\", num: i, type: \"page-active\"})\n else\n pages.push({classes: \"page\", num: i, type: \"page\"})\n\n html = template(options)\n html = $compile(html)($scope)\n\n $pagEl.html(html)\n $pagEl.show()\n\n $scope.$watch \"memberships\", (value) ->\n # Do nothing if value is not logical true\n return if not value\n\n renderPagination()\n\n $el.on \"click\", \".memberships-paginator a.next\", (event) ->\n event.preventDefault()\n\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", $scope.page + 1)\n $ctrl.loadMembers()\n\n $el.on \"click\", \".memberships-paginator a.previous\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", $scope.page - 1)\n $ctrl.loadMembers()\n\n $el.on \"click\", \".memberships-paginator li.page > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n pagenum = target.data(\"pagenum\")\n\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", pagenum)\n $ctrl.loadMembers()\n\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n linkPagination($scope, $el, $attrs, $ctrl)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgMemberships\", [\"$tgTemplate\", \"$compile\", MembershipsDirective])\n\n\n#############################################################################\n## Member Avatar Directive\n#############################################################################\n\nMembershipsRowAvatarDirective = ($log, $template, $translate) ->\n template = $template.get(\"admin/memberships-row-avatar.html\", true)\n\n link = ($scope, $el, $attrs) ->\n pending = $translate.instant(\"ADMIN.MEMBERSHIP.STATUS_PENDING\")\n render = (member) ->\n ctx = {\n full_name: if member.full_name then member.full_name else \"\"\n email: if member.user_email then member.user_email else member.email\n imgurl: if member.photo then member.photo else \"/images/unnamed.png\"\n pending: if !member.is_user_active then pending else \"\"\n }\n\n html = template(ctx)\n $el.html(html)\n\n if not $attrs.tgMembershipsRowAvatar?\n return $log.error \"MembershipsRowAvatarDirective: the directive need a member\"\n\n member = $scope.$eval($attrs.tgMembershipsRowAvatar)\n render(member)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgMembershipsRowAvatar\", [\"$log\", \"$tgTemplate\", '$translate', MembershipsRowAvatarDirective])\n\n\n#############################################################################\n## Member IsAdminCheckbox Directive\n#############################################################################\n\nMembershipsRowAdminCheckboxDirective = ($log, $repo, $confirm, $template, $compile) ->\n template = $template.get(\"admin/admin-memberships-row-checkbox.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (member) ->\n ctx = {inputId: \"is-admin-#{member.id}\"}\n\n html = template(ctx)\n html = $compile(html)($scope)\n\n $el.html(html)\n\n if not $attrs.tgMembershipsRowAdminCheckbox?\n return $log.error \"MembershipsRowAdminCheckboxDirective: the directive need a member\"\n\n member = $scope.$eval($attrs.tgMembershipsRowAdminCheckbox)\n html = render(member)\n\n if member.is_owner\n $el.find(\":checkbox\").prop(\"checked\", true)\n\n $el.on \"click\", \":checkbox\", (event) =>\n onSuccess = ->\n $confirm.notify(\"success\")\n\n onError = (data) ->\n member.revert()\n $el.find(\":checkbox\").prop(\"checked\", member.is_owner)\n $confirm.notify(\"error\", data.is_owner[0])\n\n target = angular.element(event.currentTarget)\n member.is_owner = target.prop(\"checked\")\n $repo.save(member).then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgMembershipsRowAdminCheckbox\", [\"$log\", \"$tgRepo\", \"$tgConfirm\",\n \"$tgTemplate\", \"$compile\", MembershipsRowAdminCheckboxDirective])\n\n\n#############################################################################\n## Member RoleSelector Directive\n#############################################################################\n\nMembershipsRowRoleSelectorDirective = ($log, $repo, $confirm) ->\n template = _.template(\"\"\"\n \n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n render = (member) ->\n ctx = {\n roleList: $scope.project.roles,\n selectedRole: member.role\n }\n\n html = template(ctx)\n $el.html(html)\n\n if not $attrs.tgMembershipsRowRoleSelector?\n return $log.error \"MembershipsRowRoleSelectorDirective: the directive need a member\"\n\n $ctrl = $el.controller()\n member = $scope.$eval($attrs.tgMembershipsRowRoleSelector)\n html = render(member)\n\n $el.on \"change\", \"select\", (event) =>\n onSuccess = ->\n $confirm.notify(\"success\")\n\n onError = ->\n $confirm.notify(\"error\")\n\n target = angular.element(event.currentTarget)\n newRole = parseInt(target.val(), 10)\n\n if member.role != newRole\n member.role = newRole\n $repo.save(member).then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgMembershipsRowRoleSelector\", [\"$log\", \"$tgRepo\", \"$tgConfirm\",\n MembershipsRowRoleSelectorDirective])\n\n\n#############################################################################\n## Member Actions Directive\n#############################################################################\n\nMembershipsRowActionsDirective = ($log, $repo, $rs, $confirm, $compile, $translate) ->\n activedTemplate = \"\"\"\n
\n
\n \n \n \n \"\"\"\n\n pendingTemplate = \"\"\"\n \n {{'ADMIN.MEMBERSHIP.RESEND' | translate}}\n \n \n \n \n \"\"\"\n\n link = ($scope, $el, $attrs) ->\n render = (member) ->\n if member.user\n html = $compile(activedTemplate)($scope)\n else\n html = $compile(pendingTemplate)($scope)\n\n $el.html(html)\n\n if not $attrs.tgMembershipsRowActions?\n return $log.error \"MembershipsRowActionsDirective: the directive need a member\"\n\n $ctrl = $el.controller()\n member = $scope.$eval($attrs.tgMembershipsRowActions)\n render(member)\n\n $el.on \"click\", \".pending\", (event) ->\n event.preventDefault()\n onSuccess = ->\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION\", {\n email: $scope.member.email\n })\n $confirm.notify(\"success\", text)\n onError = ->\n text = $translate.instant(\"ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION\")\n $confirm.notify(\"error\", text)\n\n $rs.memberships.resendInvitation($scope.member.id).then(onSuccess, onError)\n\n $el.on \"click\", \".delete\", (event) ->\n event.preventDefault()\n\n title = $translate.instant(\"ADMIN.MEMBERSHIP.DELETE_MEMBER\")\n defaultMsg = $translate.instant(\"ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE\", {email: member.email})\n message = if member.user then member.full_name else defaultMsg\n\n $confirm.askOnDelete(title, message).then (askResponse) ->\n onSuccess = =>\n askResponse.finish()\n\n if $scope.page > 1 && ($scope.count - 1) <= $scope.paginatedBy\n $ctrl.selectFilter(\"page\", $scope.page - 1)\n\n $ctrl.loadMembers()\n\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_DELETE\")\n $confirm.notify(\"success\", null, text)\n\n onError = =>\n askResponse.finish(false)\n\n text = $translate.instant(\"ADMIN.MEMBERSHIP.ERROR_DELETE\", {message: message})\n $confirm.notify(\"error\", null, text)\n\n $repo.remove(member).then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgMembershipsRowActions\", [\"$log\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$compile\",\n \"$translate\", MembershipsRowActionsDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/nav.coffee\n###\n\nAdminNavigationDirective = ->\n link = ($scope, $el, $attrs) ->\n section = $attrs.tgAdminNavigation\n $el.find(\".active\").removeClass(\"active\")\n $el.find(\"#adminmenu-#{section} a\").addClass(\"active\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule = angular.module(\"taigaAdmin\")\nmodule.directive(\"tgAdminNavigation\", AdminNavigationDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/project-profile.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntrim = @.taiga.trim\ntoString = @.taiga.toString\njoinStr = @.taiga.joinStr\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaAdmin\")\n\n\n#############################################################################\n## Project Profile Controller\n#############################################################################\n\nclass ProjectProfileController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @appMetaService, @translate) ->\n @scope.project = {}\n\n promise = @.loadInitialData()\n\n promise.then =>\n sectionName = @translate.instant( @scope.sectionName)\n title = @translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName, projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"project:loaded\", =>\n sectionName = @translate.instant(@scope.sectionName)\n title = @translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName, projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.pointsList = _.sortBy(project.points, \"order\")\n @scope.usStatusList = _.sortBy(project.us_statuses, \"order\")\n @scope.taskStatusList = _.sortBy(project.task_statuses, \"order\")\n @scope.prioritiesList = _.sortBy(project.priorities, \"order\")\n @scope.severitiesList = _.sortBy(project.severities, \"order\")\n @scope.issueTypesList = _.sortBy(project.issue_types, \"order\")\n @scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\")\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise\n\n openDeleteLightbox: ->\n @rootscope.$broadcast(\"deletelightbox:new\", @scope.project)\n\nmodule.controller(\"ProjectProfileController\", ProjectProfileController)\n\n\n#############################################################################\n## Project Profile Directive\n#############################################################################\n\nProjectProfileDirective = ($repo, $confirm, $loading, $navurls, $location, projectService, currentUserService) ->\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.save($scope.project)\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n newUrl = $navurls.resolve(\"project-admin-project-profile-details\", {\n project: $scope.project.slug\n })\n $location.path(newUrl)\n\n $ctrl.loadInitialData()\n\n projectService.fetchProject()\n currentUserService.loadProjects()\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link:link}\n\nmodule.directive(\"tgProjectProfile\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgNavUrls\", \"$tgLocation\",\n \"tgProjectService\", \"tgCurrentUserService\", ProjectProfileDirective])\n\n\n#############################################################################\n## Project Default Values Directive\n#############################################################################\n\nProjectDefaultValuesDirective = ($repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.save($scope.project)\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgProjectDefaultValues\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\",\n ProjectDefaultValuesDirective])\n\n#############################################################################\n## Project Modules Directive\n#############################################################################\n\nProjectModulesDirective = ($repo, $confirm, $loading, projectService) ->\n link = ($scope, $el, $attrs) ->\n submit = =>\n form = $el.find(\"form\").checksley()\n return if not form.validate()\n\n target = angular.element(\".admin-functionalities .submit-button\")\n currentLoading = $loading()\n .target(target)\n .start()\n\n promise = $repo.save($scope.project)\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n $scope.$emit(\"project:loaded\", $scope.project)\n\n projectService.fetchProject()\n\n promise.then null, (data) ->\n currentLoading.finish()\n $confirm.notify(\"error\", data._error_message)\n\n $el.on \"submit\", \"form\", (event) ->\n event.preventDefault()\n submit()\n\n $el.on \"click\", \".admin-functionalities a.button-green\", (event) ->\n event.preventDefault()\n submit()\n\n $scope.$watch \"isVideoconferenceActivated\", (isVideoconferenceActivated) ->\n if isVideoconferenceActivated\n $el.find(\".videoconference-attributes\").removeClass(\"hidden\")\n else\n $el.find(\".videoconference-attributes\").addClass(\"hidden\")\n $scope.project.videoconferences = null\n $scope.project.videoconferences_extra_data = \"\"\n\n $scope.$watch \"project\", (project) ->\n if project.videoconferences?\n $scope.isVideoconferenceActivated = true\n else\n $scope.isVideoconferenceActivated = false\n\n return {link:link}\n\nmodule.directive(\"tgProjectModules\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgProjectService\",\n ProjectModulesDirective])\n\n\n#############################################################################\n## Project Export Directive\n#############################################################################\n\nProjectExportDirective = ($window, $rs, $confirm, $translate) ->\n link = ($scope, $el, $attrs) ->\n buttonsEl = $el.find(\".admin-project-export-buttons\")\n showButtons = -> buttonsEl.removeClass(\"hidden\")\n hideButtons = -> buttonsEl.addClass(\"hidden\")\n\n resultEl = $el.find(\".admin-project-export-result\")\n showResult = -> resultEl.removeClass(\"hidden\")\n hideResult = -> resultEl.addClass(\"hidden\")\n\n spinnerEl = $el.find(\".spin\")\n showSpinner = -> spinnerEl.removeClass(\"hidden\")\n hideSpinner = -> spinnerEl.addClass(\"hidden\")\n\n resultTitleEl = $el.find(\".result-title\")\n\n\n loading_title = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_TITLE\")\n loading_msg = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_MESSAGE\")\n dump_ready_text = -> resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.DUMP_READY\"))\n asyn_message = -> resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE\"))\n syn_message = (url) -> resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.SYNC_MESSAGE\", {\n url: url}))\n\n setLoadingTitle = -> resultTitleEl.html(loading_title)\n setAsyncTitle = -> resultTitleEl.html(loading_msg)\n setSyncTitle = -> resultTitleEl.html(dump_ready_text)\n\n resultMessageEl = $el.find(\".result-message \")\n setLoadingMessage = -> resultMessageEl.html(loading_msg)\n setAsyncMessage = -> resultMessageEl.html(asyn_message)\n setSyncMessage = (url) -> resultMessageEl.html(syn_message(url))\n\n showLoadingMode = ->\n showSpinner()\n setLoadingTitle()\n setLoadingMessage()\n hideButtons()\n showResult()\n\n showExportResultAsyncMode = ->\n hideSpinner()\n setAsyncTitle()\n setAsyncMessage()\n\n showExportResultSyncMode = (url) ->\n hideSpinner()\n setSyncTitle()\n setSyncMessage(url)\n\n showErrorMode = ->\n hideSpinner()\n hideResult()\n showButtons()\n\n $el.on \"click\", \"a.button-export\", debounce 2000, (event) =>\n event.preventDefault()\n\n onSuccess = (result) =>\n if result.status == 202 # Async mode\n showExportResultAsyncMode()\n else #result.status == 200 # Sync mode\n dumpUrl = result.data.url\n showExportResultSyncMode(dumpUrl)\n $window.open(dumpUrl, \"_blank\")\n\n onError = (result) =>\n showErrorMode()\n\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR\")\n\n if result.status == 429 # TOO MANY REQUESTS\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\")\n else if result.data?._error_message\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\", {\n message: result.data._error_message})\n\n $confirm.notify(\"error\", errorMsg)\n\n showLoadingMode()\n $rs.projects.export($scope.projectId).then(onSuccess, onError)\n\n return {link:link}\n\nmodule.directive(\"tgProjectExport\", [\"$window\", \"$tgResources\", \"$tgConfirm\", \"$translate\",\n ProjectExportDirective])\n\n\n#############################################################################\n## CSV Export Controllers\n#############################################################################\n\nclass CsvExporterController extends taiga.Controller\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgUrls\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @urls, @confirm, @rs, @translate) ->\n @rootscope.$on(\"project:loaded\", @.setCsvUuid)\n @scope.$watch \"csvUuid\", (value) =>\n if value\n @scope.csvUrl = @urls.resolveAbsolute(\"#{@.type}-csv\", value)\n else\n @scope.csvUrl = \"\"\n\n setCsvUuid: =>\n @scope.csvUuid = @scope.project[\"#{@.type}_csv_uuid\"]\n\n _generateUuid: (response=null) =>\n promise = @rs.projects[\"regenerate_#{@.type}_csv_uuid\"](@scope.projectId)\n\n promise.then (data) =>\n @scope.csvUuid = data.data?.uuid\n\n promise.then null, =>\n @confirm.notify(\"error\")\n\n promise.finally ->\n response.finish() if response\n return promise\n\n regenerateUuid: ->\n if @scope.csvUuid\n title = @translate.instant(\"ADMIN.REPORTS.REGENERATE_TITLE\")\n subtitle = @translate.instant(\"ADMIN.REPORTS.REGENERATE_SUBTITLE\")\n\n @confirm.ask(title, subtitle).then @._generateUuid\n else\n @._generateUuid()\n\n\nclass CsvExporterUserstoriesController extends CsvExporterController\n type: \"userstories\"\n\n\nclass CsvExporterTasksController extends CsvExporterController\n type: \"tasks\"\n\n\nclass CsvExporterIssuesController extends CsvExporterController\n type: \"issues\"\n\n\nmodule.controller(\"CsvExporterUserstoriesController\", CsvExporterUserstoriesController)\nmodule.controller(\"CsvExporterTasksController\", CsvExporterTasksController)\nmodule.controller(\"CsvExporterIssuesController\", CsvExporterIssuesController)\n\n\n#############################################################################\n## CSV Directive\n#############################################################################\n\nCsvUsDirective = ($translate) ->\n link = ($scope) ->\n $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_US\"\n\n return {\n controller: \"CsvExporterUserstoriesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n }\n\nmodule.directive(\"tgCsvUs\", [\"$translate\", CsvUsDirective])\n\n\nCsvTaskDirective = ($translate) ->\n link = ($scope) ->\n $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_TASK\"\n\n return {\n controller: \"CsvExporterTasksController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n }\n\nmodule.directive(\"tgCsvTask\", [\"$translate\", CsvTaskDirective])\n\n\nCsvIssueDirective = ($translate) ->\n link = ($scope) ->\n $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_ISSUE\"\n\n return {\n controller: \"CsvExporterIssuesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n }\n\nmodule.directive(\"tgCsvIssue\", [\"$translate\", CsvIssueDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/project-profile.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntrim = @.taiga.trim\ntoString = @.taiga.toString\njoinStr = @.taiga.joinStr\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaAdmin\")\n\n#############################################################################\n## Project values section Controller\n#############################################################################\n\nclass ProjectValuesSectionController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @appMetaService, @translate) ->\n @scope.project = {}\n\n promise = @.loadInitialData()\n\n promise.then () =>\n sectionName = @translate.instant(@scope.sectionName)\n\n title = @translate.instant(\"ADMIN.PROJECT_VALUES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": @scope.project.name\n })\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise\n\n\nmodule.controller(\"ProjectValuesSectionController\", ProjectValuesSectionController)\n\n#############################################################################\n## Project values Controller\n#############################################################################\n\nclass ProjectValuesController extends taiga.Controller\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs) ->\n @scope.$on(\"admin:project-values:move\", @.moveValue)\n @rootscope.$on(\"project:loaded\", @.loadValues)\n\n loadValues: =>\n return @rs[@scope.resource].listValues(@scope.projectId, @scope.type).then (values) =>\n @scope.values = values\n @scope.maxValueOrder = _.max(values, \"order\").order\n return values\n\n moveValue: (ctx, itemValue, itemIndex) =>\n values = @scope.values\n r = values.indexOf(itemValue)\n values.splice(r, 1)\n values.splice(itemIndex, 0, itemValue)\n _.each values, (value, index) ->\n value.order = index\n\n @repo.saveAll(values)\n\nmodule.controller(\"ProjectValuesController\", ProjectValuesController)\n\n\n#############################################################################\n## Project values directive\n#############################################################################\n\nProjectValuesDirective = ($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope) ->\n ## Drag & Drop Link\n\n linkDragAndDrop = ($scope, $el, $attrs) ->\n oldParentScope = null\n newParentScope = null\n itemEl = null\n tdom = $el.find(\".sortable\")\n\n tdom.sortable({\n handle: \".row.table-main.visualization\",\n dropOnEmpty: true\n connectWith: \".project-values-body\"\n revert: 400\n axis: \"y\"\n })\n\n tdom.on \"sortstop\", (event, ui) ->\n itemEl = ui.item\n itemValue = itemEl.scope().value\n itemIndex = itemEl.index()\n $scope.$broadcast(\"admin:project-values:move\", itemValue, itemIndex)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n ## Value Link\n\n linkValue = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n valueType = $attrs.type\n objName = $attrs.objname\n\n initializeNewValue = ->\n $scope.newValue = {\n \"name\": \"\"\n \"is_closed\": false\n \"is_archived\": false\n }\n\n initializeTextTranslations = ->\n $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_#{objName.toUpperCase()}.ACTION_ADD\")\n\n initializeNewValue()\n initializeTextTranslations()\n\n $rootscope.$on \"$translateChangeEnd\", ->\n $scope.$evalAsync(initializeTextTranslations)\n\n goToBottomList = (focus = false) =>\n table = $el.find(\".table-main\")\n\n $(document.body).scrollTop(table.offset().top + table.height())\n\n if focus\n $el.find(\".new-value input:visible\").first().focus()\n\n saveValue = (target) ->\n formEl = target.parents(\"form\")\n form = formEl.checksley()\n return if not form.validate()\n\n value = formEl.scope().value\n promise = $repo.save(value)\n promise.then =>\n row = target.parents(\".row.table-main\")\n row.addClass(\"hidden\")\n row.siblings(\".visualization\").removeClass('hidden')\n\n promise.then null, (data) ->\n form.setErrors(data)\n\n saveNewValue = (target) ->\n formEl = target.parents(\"form\")\n form = formEl.checksley()\n return if not form.validate()\n\n $scope.newValue.project = $scope.project.id\n\n $scope.newValue.order = if $scope.maxValueOrder then $scope.maxValueOrder + 1 else 1\n\n promise = $repo.create(valueType, $scope.newValue)\n promise.then (data) =>\n target.addClass(\"hidden\")\n\n $scope.values.push(data)\n $scope.maxValueOrder = data.order\n initializeNewValue()\n\n promise.then null, (data) ->\n form.setErrors(data)\n\n cancel = (target) ->\n row = target.parents(\".row.table-main\")\n formEl = target.parents(\"form\")\n value = formEl.scope().value\n $scope.$apply ->\n row.addClass(\"hidden\")\n value.revert()\n row.siblings(\".visualization\").removeClass('hidden')\n\n $el.on \"click\", \".show-add-new\", (event) ->\n event.preventDefault()\n $el.find(\".new-value\").removeClass('hidden')\n\n goToBottomList(true)\n\n $el.on \"click\", \".add-new\", debounce 2000, (event) ->\n event.preventDefault()\n target = $el.find(\".new-value\")\n saveNewValue(target)\n\n $el.on \"click\", \".delete-new\", (event) ->\n event.preventDefault()\n $el.find(\".new-value\").addClass(\"hidden\")\n initializeNewValue()\n\n $el.on \"click\", \".edit-value\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n row = target.parents(\".row.table-main\")\n row.addClass(\"hidden\")\n\n editionRow = row.siblings(\".edition\")\n editionRow.removeClass('hidden')\n editionRow.find('input:visible').first().focus().select()\n\n $el.on \"keyup\", \".edition input\", (event) ->\n if event.keyCode == 13\n target = angular.element(event.currentTarget)\n saveValue(target)\n else if event.keyCode == 27\n target = angular.element(event.currentTarget)\n cancel(target)\n\n $el.on \"keyup\", \".new-value input\", (event) ->\n if event.keyCode == 13\n target = $el.find(\".new-value\")\n saveNewValue(target)\n else if event.keyCode == 27\n $el.find(\".new-value\").addClass(\"hidden\")\n initializeNewValue()\n\n $el.on \"click\", \".save\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n saveValue(target)\n\n $el.on \"click\", \".cancel\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n cancel(target)\n\n $el.on \"click\", \".delete-value\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.parents(\"form\")\n value = formEl.scope().value\n\n choices = {}\n _.each $scope.values, (option) ->\n if value.id != option.id\n choices[option.id] = option.name\n\n subtitle = value.name\n\n if _.keys(choices).length == 0\n return $confirm.error($translate.instant(\"ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL\"))\n\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE\")\n text = $translate.instant(\"ADMIN.PROJECT_VALUES.REPLACEMENT\")\n\n $confirm.askChoice(title, subtitle, choices, text).then (response) ->\n onSucces = ->\n $ctrl.loadValues().finally ->\n response.finish()\n onError = ->\n $confirm.notify(\"error\")\n $repo.remove(value, {\"moveTo\": response.selected}).then(onSucces, onError)\n\n link = ($scope, $el, $attrs) ->\n linkDragAndDrop($scope, $el, $attrs)\n linkValue($scope, $el, $attrs)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgProjectValues\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", ProjectValuesDirective])\n\n\n#############################################################################\n## Color selection directive\n#############################################################################\n\nColorSelectionDirective = () ->\n ## Color selection Link\n\n link = ($scope, $el, $attrs, $model) ->\n $ctrl = $el.controller()\n\n $scope.$watch $attrs.ngModel, (element) ->\n $scope.color = element.color\n\n $el.on \"click\", \".current-color\", (event) ->\n # Showing the color selector\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n $el.find(\".select-color\").hide()\n target.siblings(\".select-color\").show()\n # Hide when click outside\n body = angular.element(\"body\")\n body.on \"click\", (event) =>\n if angular.element(event.target).parent(\".select-color\").length == 0\n $el.find(\".select-color\").hide()\n body.unbind(\"click\")\n\n $el.on \"click\", \".select-color .color\", (event) ->\n # Selecting one color on color selector\n event.preventDefault()\n target = angular.element(event.currentTarget)\n $scope.$apply ->\n $model.$modelValue.color = target.data(\"color\")\n $el.find(\".select-color\").hide()\n\n $el.on \"click\", \".select-color .selected-color\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $model.$modelValue.color = $scope.color\n $el.find(\".select-color\").hide()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n require:\"ngModel\"\n }\n\nmodule.directive(\"tgColorSelection\", ColorSelectionDirective)\n\n\n#############################################################################\n## Custom Attributes Controller\n#############################################################################\n\n# Custom attributes types (see taiga-back/taiga/projects/custom_attributes/choices.py)\nTEXT_TYPE = \"text\"\nMULTILINE_TYPE = \"multiline\"\nDATE_TYPE = \"date\"\n\n\nTYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n },\n {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n },\n {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }\n]\n\nclass ProjectCustomAttributesController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @rs, @params, @q, @location, @navUrls, @appMetaService,\n @translate) ->\n @scope.TYPE_CHOICES = TYPE_CHOICES\n\n @scope.project = {}\n\n @rootscope.$on \"project:loaded\", =>\n @.loadCustomAttributes()\n\n sectionName = @translate.instant(@scope.sectionName)\n title = @translate.instant(\"ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": @scope.project.name\n })\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n #########################\n # Custom Attribute\n #########################\n\n loadCustomAttributes: =>\n return @rs.customAttributes[@scope.type].list(@scope.projectId).then (customAttributes) =>\n @scope.customAttributes = customAttributes\n @scope.maxOrder = _.max(customAttributes, \"order\").order\n return customAttributes\n\n createCustomAttribute: (attrValues) =>\n return @repo.create(\"custom-attributes/#{@scope.type}\", attrValues)\n\n saveCustomAttribute: (attrModel) =>\n return @repo.save(attrModel)\n\n deleteCustomAttribute: (attrModel) =>\n return @repo.remove(attrModel)\n\n moveCustomAttributes: (attrModel, newIndex) =>\n customAttributes = @scope.customAttributes\n r = customAttributes.indexOf(attrModel)\n customAttributes.splice(r, 1)\n customAttributes.splice(newIndex, 0, attrModel)\n\n _.each customAttributes, (val, idx) ->\n val.order = idx\n\n @repo.saveAll(customAttributes)\n\n\nmodule.controller(\"ProjectCustomAttributesController\", ProjectCustomAttributesController)\n\n\n#############################################################################\n## Custom Attributes Directive\n#############################################################################\n\nProjectCustomAttributesDirective = ($log, $confirm, animationFrame, $translate) ->\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n ##################################\n # Drag & Drop\n ##################################\n sortableEl = $el.find(\".js-sortable\")\n\n sortableEl.sortable({\n handle: \".js-view-custom-field\",\n dropOnEmpty: true\n revert: 400\n axis: \"y\"\n })\n\n sortableEl.on \"sortstop\", (event, ui) ->\n itemEl = ui.item\n itemAttr = itemEl.scope().attr\n itemIndex = itemEl.index()\n $ctrl.moveCustomAttributes(itemAttr, itemIndex)\n\n ##################################\n # New custom attribute\n ##################################\n\n showCreateForm = ->\n $el.find(\".js-new-custom-field\").removeClass(\"hidden\")\n $el.find(\".js-new-custom-field input:visible\").first().focus()\n\n hideCreateForm = ->\n $el.find(\".js-new-custom-field\").addClass(\"hidden\")\n\n showAddButton = ->\n $el.find(\".js-add-custom-field-button\").removeClass(\"hidden\")\n\n hideAddButton = ->\n $el.find(\".js-add-custom-field-button\").addClass(\"hidden\")\n\n showCancelButton = ->\n $el.find(\".js-cancel-new-custom-field-button\").removeClass(\"hidden\")\n\n hideCancelButton = ->\n $el.find(\".js-cancel-new-custom-field-button\").addClass(\"hidden\")\n\n resetNewAttr = ->\n $scope.newAttr = {}\n\n create = (formEl) ->\n form = formEl.checksley()\n return if not form.validate()\n\n onSucces = =>\n $ctrl.loadCustomAttributes()\n hideCreateForm()\n resetNewAttr()\n $confirm.notify(\"success\")\n\n onError = (data) =>\n form.setErrors(data)\n\n attr = $scope.newAttr\n attr.project = $scope.projectId\n attr.order = if $scope.maxOrder then $scope.maxOrder + 1 else 1\n\n $ctrl.createCustomAttribute(attr).then(onSucces, onError)\n\n cancelCreate = ->\n hideCreateForm()\n resetNewAttr()\n\n $scope.$watch \"customAttributes\", (customAttributes) ->\n return if not customAttributes\n\n if customAttributes.length == 0\n hideCancelButton()\n hideAddButton()\n showCreateForm()\n else\n hideCreateForm()\n showAddButton()\n showCancelButton()\n\n $el.on \"click\", \".js-add-custom-field-button\", (event) ->\n event.preventDefault()\n\n showCreateForm()\n\n $el.on \"click\", \".js-create-custom-field-button\", debounce 2000, (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n create(formEl)\n\n $el.on \"click\", \".js-cancel-new-custom-field-button\", (event) ->\n event.preventDefault()\n\n cancelCreate()\n\n $el.on \"keyup\", \".js-new-custom-field input\", (event) ->\n if event.keyCode == 13 # Enter\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n create(formEl)\n else if event.keyCode == 27 # Esc\n cancelCreate()\n\n ##################################\n # Edit custom attribute\n ##################################\n\n showEditForm = (formEl) ->\n formEl.find(\".js-view-custom-field\").addClass(\"hidden\")\n formEl.find(\".js-edit-custom-field\").removeClass(\"hidden\")\n formEl.find(\".js-edit-custom-field input:visible\").first().focus().select()\n\n hideEditForm = (formEl) ->\n formEl.find(\".js-edit-custom-field\").addClass(\"hidden\")\n formEl.find(\".js-view-custom-field\").removeClass(\"hidden\")\n\n revertChangesInCustomAttribute = (formEl) ->\n $scope.$apply ->\n formEl.scope().attr.revert()\n\n update = (formEl) ->\n form = formEl.checksley()\n return if not form.validate()\n\n onSucces = =>\n $ctrl.loadCustomAttributes()\n hideEditForm(formEl)\n $confirm.notify(\"success\")\n\n onError = (data) =>\n form.setErrors(data)\n\n attr = formEl.scope().attr\n $ctrl.saveCustomAttribute(attr).then(onSucces, onError)\n\n cancelUpdate = (formEl) ->\n hideEditForm(formEl)\n revertChangesInCustomAttribute(formEl)\n\n $el.on \"click\", \".js-edit-custom-field-button\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n showEditForm(formEl)\n\n $el.on \"click\", \".js-update-custom-field-button\", debounce 2000, (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n update(formEl)\n\n $el.on \"click\", \".js-cancel-edit-custom-field-button\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n cancelUpdate(formEl)\n\n $el.on \"keyup\", \".js-edit-custom-field input\", (event) ->\n if event.keyCode == 13 # Enter\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n update(formEl)\n else if event.keyCode == 27 # Esc\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n cancelUpdate(formEl)\n\n ##################################\n # Delete custom attribute\n ##################################\n\n deleteCustomAttribute = (formEl) ->\n attr = formEl.scope().attr\n message = attr.name\n\n title = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.DELETE\")\n text = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE\")\n\n $confirm.ask(title, text, message).then (response) ->\n onSucces = ->\n $ctrl.loadCustomAttributes().finally -> response.finish()\n\n onError = ->\n $confirm.notify(\"error\", null, \"We have not been able to delete '#{message}'.\")\n\n $ctrl.deleteCustomAttribute(attr).then(onSucces, onError)\n\n $el.on \"click\", \".js-delete-custom-field-button\", debounce 2000, (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n deleteCustomAttribute(formEl)\n\n return {link: link}\n\nmodule.directive(\"tgProjectCustomAttributes\", [\"$log\", \"$tgConfirm\", \"animationFrame\", \"$translate\",\n ProjectCustomAttributesDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/memberships.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaAdmin\")\n\n\n#############################################################################\n## Project Roles Controller\n#############################################################################\n\nclass RolesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = \"ADMIN.MENU.PERMISSIONS\"\n @scope.project = {}\n @scope.anyComputableRole = true\n\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.ROLES.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n\n @scope.$emit('project:loaded', project)\n @scope.anyComputableRole = _.some(_.map(project.roles, (point) -> point.computable))\n\n return project\n\n loadRoles: ->\n return @rs.roles.list(@scope.projectId).then (roles) =>\n roles = roles.map (role) ->\n role.external_user = false\n\n return role\n\n public_permission = {\n \"name\": @translate.instant(\"ADMIN.ROLES.EXTERNAL_USER\"),\n \"permissions\": @scope.project.public_permissions,\n \"external_user\": true\n }\n\n roles.push(public_permission)\n\n @scope.roles = roles\n @scope.role = @scope.roles[0]\n return roles\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then(=> @.loadRoles())\n return promise\n\n setRole: (role) ->\n @scope.role = role\n @scope.$broadcast(\"role:changed\", @scope.role)\n\n delete: ->\n choices = {}\n for role in @scope.roles\n if role.id != @scope.role.id\n choices[role.id] = role.name\n\n if _.keys(choices).length == 0\n return @confirm.error(@translate.instant(\"ADMIN.ROLES.ERROR_DELETE_ALL\"))\n\n title = @translate.instant(\"ADMIN.ROLES.TITLE_DELETE_ROLE\")\n subtitle = @scope.role.name\n replacement = @translate.instant(\"ADMIN.ROLES.REPLACEMENT_ROLE\")\n warning = @translate.instant(\"ADMIN.ROLES.WARNING_DELETE_ROLE\")\n return @confirm.askChoice(title, subtitle, choices, replacement, warning).then (response) =>\n onSuccess = =>\n @.loadProject()\n @.loadRoles().finally =>\n response.finish()\n onError = =>\n @confirm.notify('error')\n\n return @repo.remove(@scope.role, {moveTo: response.selected}).then onSuccess, onError\n\n _enableComputable: =>\n onSuccess = =>\n @confirm.notify(\"success\")\n @.loadProject()\n\n onError = =>\n @confirm.notify(\"error\")\n @scope.role.revert()\n\n @repo.save(@scope.role).then onSuccess, onError\n\n _disableComputable: =>\n askOnSuccess = (response) =>\n onSuccess = =>\n response.finish()\n @confirm.notify(\"success\")\n @.loadProject()\n onError = =>\n response.finish()\n @confirm.notify(\"error\")\n @scope.role.revert()\n @repo.save(@scope.role).then onSuccess, onError\n\n askOnError = (response) =>\n @scope.role.revert()\n\n title = @translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_TITLE\")\n subtitle = @translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_SUBTITLE\", {\n roleName: @scope.role.name\n })\n message = @translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_MESSAGE\")\n return @confirm.ask(title, subtitle, message).then askOnSuccess, askOnError\n\n toggleComputable: debounce 2000, ->\n if not @scope.role.computable\n @._disableComputable()\n else\n @._enableComputable()\n\nmodule.controller(\"RolesController\", RolesController)\n\n\nEditRoleDirective = ($repo, $confirm) ->\n link = ($scope, $el, $attrs) ->\n toggleView = ->\n $el.find('.total').toggle()\n $el.find('.edit-role').toggle()\n\n submit = () ->\n $scope.role.name = $el.find(\"input\").val()\n\n promise = $repo.save($scope.role)\n\n promise.then ->\n $confirm.notify(\"success\")\n\n promise.then null, (data) ->\n $confirm.notify(\"error\")\n\n toggleView()\n\n $el.on \"click\", \"a.icon-edit\", ->\n toggleView()\n $el.find(\"input\").focus()\n $el.find(\"input\").val($scope.role.name)\n\n $el.on \"click\", \"a.save\", submit\n\n $el.on \"keyup\", \"input\", (event) ->\n if event.keyCode == 13 # Enter key\n submit()\n else if event.keyCode == 27 # ESC key\n toggleView()\n\n $scope.$on \"role:changed\", ->\n if $el.find('.edit-role').is(\":visible\")\n toggleView()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgEditRole\", [\"$tgRepo\", \"$tgConfirm\", EditRoleDirective])\n\nRolesDirective = ->\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgRoles\", RolesDirective)\n\nNewRoleDirective = ($tgrepo, $confirm) ->\n DEFAULT_PERMISSIONS = [\"view_project\", \"view_milestones\", \"view_us\", \"view_tasks\", \"view_issues\"]\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $el.on \"click\", \"a.add-button\", (event) ->\n event.preventDefault()\n $el.find(\".new\").removeClass(\"hidden\")\n $el.find(\".new\").focus()\n $el.find(\".add-button\").hide()\n\n $el.on \"keyup\", \".new\", (event) ->\n event.preventDefault()\n if event.keyCode == 13 # Enter key\n target = angular.element(event.currentTarget)\n newRole = {\n project: $scope.projectId\n name: target.val()\n permissions: DEFAULT_PERMISSIONS\n order: _.max($scope.roles, (r) -> r.order).order + 1\n computable: false\n }\n\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new\").val('')\n\n onSuccess = (role) ->\n insertPosition = $scope.roles.length - 1\n $scope.roles.splice(insertPosition, 0, role)\n $ctrl.setRole(role)\n $el.find(\".add-button\").show()\n $ctrl.loadProject()\n\n onError = ->\n $confirm.notify(\"error\")\n\n $tgrepo.create(\"roles\", newRole).then(onSuccess, onError)\n\n else if event.keyCode == 27 # ESC key\n target = angular.element(event.currentTarget)\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new\").val('')\n $el.find(\".add-button\").show()\n\n return {link:link}\n\nmodule.directive(\"tgNewRole\", [\"$tgRepo\", \"$tgConfirm\", NewRoleDirective])\n\n\n# Use category-config.scss styles\nRolePermissionsDirective = ($rootscope, $repo, $confirm, $compile) ->\n resumeTemplate = _.template(\"\"\"\n
\">
\n
\n
<%- category.activePermissions %>/<%- category.permissions.length %>
\n <% _.each(category.permissions, function(permission) { %>\n
active<% } %>\"\n title=\"{{ '<%- permission.name %>' | translate }}\">
\n <% }) %>\n
\n
\n \"\"\")\n\n categoryTemplate = _.template(\"\"\"\n
\">\n
\n
\n
\n
\n <% _.each(category.permissions, function(permission) { %>\n
\">\n \">\n
\n disabled=\"disabled\" <% } %>\n <% if(permission.active) { %> checked=\"checked\" <% } %>/>\n
\n \n \n
\n
\n <% }) %>\n
\n
\n
\n \"\"\")\n\n baseTemplate = _.template(\"\"\"\n
\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n generateCategoriesFromRole = (role) ->\n setActivePermissions = (permissions) ->\n return _.map(permissions, (x) -> _.extend({}, x, {active: x[\"key\"] in role.permissions}))\n\n isPermissionEditable = (permission, role, project) ->\n if role.external_user &&\n !project.is_private &&\n permission.key.indexOf(\"view_\") == 0\n return false\n else\n return true\n\n setActivePermissionsPerCategory = (category) ->\n return _.map(category, (cat) ->\n cat.permissions = cat.permissions.map (permission) ->\n permission.editable = isPermissionEditable(permission, role, $scope.project)\n\n return permission\n\n _.extend({}, cat, {\n activePermissions: _.filter(cat[\"permissions\"], \"active\").length\n })\n )\n\n categories = []\n\n milestonePermissions = [\n { key: \"view_milestones\", name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS\"}\n { key: \"add_milestone\", name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS\"}\n { key: \"modify_milestone\", name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS\"}\n { key: \"delete_milestone\", name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME\",\n permissions: setActivePermissions(milestonePermissions)\n })\n\n userStoryPermissions = [\n { key: \"view_us\", name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES\"}\n { key: \"add_us\", name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES\"}\n { key: \"modify_us\", name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES\"}\n { key: \"delete_us\", name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME\",\n permissions: setActivePermissions(userStoryPermissions)\n })\n\n taskPermissions = [\n { key: \"view_tasks\", name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS\"}\n { key: \"add_task\", name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS\"}\n { key: \"modify_task\", name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS\"}\n { key: \"delete_task\", name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME\" ,\n permissions: setActivePermissions(taskPermissions)\n })\n\n issuePermissions = [\n { key: \"view_issues\", name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES\"}\n { key: \"add_issue\", name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES\"}\n { key: \"modify_issue\", name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES\"}\n { key: \"delete_issue\", name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME\",\n permissions: setActivePermissions(issuePermissions)\n })\n\n wikiPermissions = [\n { key: \"view_wiki_pages\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES\"}\n { key: \"add_wiki_page\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES\"}\n { key: \"modify_wiki_page\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES\"}\n { key: \"delete_wiki_page\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES\"}\n { key: \"view_wiki_links\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS\"}\n { key: \"add_wiki_link\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS\"}\n { key: \"delete_wiki_link\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME\",\n permissions: setActivePermissions(wikiPermissions)\n })\n\n return setActivePermissionsPerCategory(categories)\n\n renderResume = (element, category) ->\n element.find(\".resume\").html($compile(resumeTemplate({category: category}))($scope))\n\n renderCategory = (category, index) ->\n html = categoryTemplate({category: category, index: index})\n html = angular.element(html)\n renderResume(html, category)\n return $compile(html)($scope)\n\n renderPermissions = () ->\n $el.off()\n html = baseTemplate()\n _.each generateCategoriesFromRole($scope.role), (category, index) ->\n html = angular.element(html).append(renderCategory(category, index))\n\n $el.html(html)\n $el.on \"click\", \".resume\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.next().toggleClass(\"open\")\n\n $el.on \"change\", \".category-item input\", (event) ->\n getActivePermissions = ->\n activePermissions = _.filter($el.find(\".category-item input\"), (t) ->\n angular.element(t).is(\":checked\")\n )\n activePermissions = _.sortBy(_.map(activePermissions, (t) ->\n permission = angular.element(t).parents(\".category-item\").data(\"id\")\n ))\n\n if activePermissions.length\n activePermissions.push(\"view_project\")\n\n return activePermissions\n\n target = angular.element(event.currentTarget)\n\n $scope.role.permissions = getActivePermissions()\n\n onSuccess = () ->\n categories = generateCategoriesFromRole($scope.role)\n categoryId = target.parents(\".category-config\").data(\"id\")\n renderResume(target.parents(\".category-config\"), categories[categoryId])\n $rootscope.$broadcast(\"projects:reload\")\n $confirm.notify(\"success\")\n $ctrl.loadProject()\n\n onError = ->\n $confirm.notify(\"error\")\n target.prop \"checked\", !target.prop(\"checked\")\n $scope.role.permissions = getActivePermissions()\n\n if $scope.role.external_user\n $scope.project.public_permissions = $scope.role.permissions\n $scope.project.anon_permissions = $scope.role.permissions.filter (permission) ->\n return permission.indexOf(\"view_\") == 0\n\n $repo.save($scope.project).then onSuccess, onError\n else\n $repo.save($scope.role).then onSuccess, onError\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $scope.$on \"role:changed\", ->\n renderPermissions()\n\n bindOnce($scope, $attrs.ngModel, renderPermissions)\n\n return {link:link}\n\nmodule.directive(\"tgRolePermissions\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\",\n RolePermissionsDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/third-parties.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\nbindMethods = @.taiga.bindMethods\ndebounce = @.taiga.debounce\ntimeout = @.taiga.timeout\n\nmodule = angular.module(\"taigaAdmin\")\n\n\n#############################################################################\n## Webhooks\n#############################################################################\n\nclass WebhooksController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @location, @navUrls, @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = \"ADMIN.WEBHOOKS.SECTION_NAME\"\n @scope.project = {}\n\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.WEBHOOKS.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"webhooks:reload\", @.loadWebhooks\n\n loadWebhooks: ->\n return @rs.webhooks.list(@scope.projectId).then (webhooks) =>\n @scope.webhooks = webhooks\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then =>\n @.loadWebhooks()\n\n return promise\n\nmodule.controller(\"WebhooksController\", WebhooksController)\n\n\n#############################################################################\n## Webhook Directive\n#############################################################################\n\nWebhookDirective = ($rs, $repo, $confirm, $loading, $translate) ->\n link = ($scope, $el, $attrs) ->\n webhook = $scope.$eval($attrs.tgWebhook)\n\n updateLogs = () ->\n prettyDate = $translate.instant(\"ADMIN.WEBHOOKS.DATE\")\n\n $rs.webhooklogs.list(webhook.id).then (webhooklogs) =>\n for log in webhooklogs\n log.validStatus = 200 <= log.status < 300\n log.prettySentHeaders = _.map(_.pairs(log.request_headers), ([header, value]) -> \"#{header}: #{value}\").join(\"\\n\")\n log.prettySentData = JSON.stringify(log.request_data)\n log.prettyDate = moment(log.created).format(prettyDate)\n\n webhook.logs_counter = webhooklogs.length\n webhook.logs = webhooklogs\n updateShowHideHistoryText()\n\n updateShowHideHistoryText = () ->\n textElement = $el.find(\".toggle-history\")\n historyElement = textElement.parents(\".single-webhook-wrapper\").find(\".webhooks-history\")\n\n if historyElement.hasClass(\"open\")\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY\")\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY_TITLE\")\n else\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY\")\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY_TITLE\")\n\n textElement.text(text)\n textElement.prop(\"title\", title)\n\n showVisualizationMode = () ->\n $el.find(\".edition-mode\").addClass(\"hidden\")\n $el.find(\".visualization-mode\").removeClass(\"hidden\")\n\n showEditMode = () ->\n $el.find(\".visualization-mode\").addClass(\"hidden\")\n $el.find(\".edition-mode\").removeClass(\"hidden\")\n\n openHistory = () ->\n $el.find(\".webhooks-history\").addClass(\"open\")\n\n cancel = () ->\n showVisualizationMode()\n $scope.$apply ->\n webhook.revert()\n\n save = debounce 2000, (target) ->\n form = target.parents(\"form\").checksley()\n return if not form.validate()\n promise = $repo.save(webhook)\n promise.then =>\n showVisualizationMode()\n\n promise.then null, (data) ->\n $confirm.notify(\"error\")\n form.setErrors(data)\n\n $el.on \"click\", \".test-webhook\", () ->\n openHistory()\n $rs.webhooks.test(webhook.id).then =>\n updateLogs()\n\n $el.on \"click\", \".edit-webhook\", () ->\n showEditMode()\n\n $el.on \"click\", \".cancel-existing\", () ->\n cancel()\n\n $el.on \"click\", \".edit-existing\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n save(target)\n\n $el.on \"keyup\", \".edition-mode input\", (event) ->\n if event.keyCode == 13\n target = angular.element(event.currentTarget)\n save(target)\n else if event.keyCode == 27\n target = angular.element(event.currentTarget)\n cancel(target)\n\n $el.on \"click\", \".delete-webhook\", () ->\n title = $translate.instant(\"ADMIN.WEBHOOKS.DELETE\")\n message = $translate.instant(\"ADMIN.WEBHOOKS.WEBHOOK_NAME\", {name: webhook.name})\n\n $confirm.askOnDelete(title, message).then (askResponse) =>\n onSucces = ->\n askResponse.finish()\n $scope.$emit(\"webhooks:reload\")\n\n onError = ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n $repo.remove(webhook).then(onSucces, onError)\n\n $el.on \"click\", \".toggle-history\", (event) ->\n target = angular.element(event.currentTarget)\n if not webhook.logs? or webhook.logs.length == 0\n updateLogs().then ->\n #Waiting for ng-repeat to finish\n timeout 0, ->\n $el.find(\".webhooks-history\").toggleClass(\"open\")\n updateShowHideHistoryText()\n\n else\n $el.find(\".webhooks-history\").toggleClass(\"open\")\n $scope.$apply () ->\n updateShowHideHistoryText()\n\n\n $el.on \"click\", \".history-single\", (event) ->\n target = angular.element(event.currentTarget)\n target.toggleClass(\"history-single-open\")\n target.siblings(\".history-single-response\").toggleClass(\"open\")\n\n $el.on \"click\", \".resend-request\", (event) ->\n target = angular.element(event.currentTarget)\n log = target.data(\"log\")\n $rs.webhooklogs.resend(log).then () =>\n updateLogs()\n\n return {link:link}\n\nmodule.directive(\"tgWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$translate\",\n WebhookDirective])\n\n\n#############################################################################\n## New webhook Directive\n#############################################################################\n\nNewWebhookDirective = ($rs, $repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n webhook = $scope.$eval($attrs.tgWebhook)\n formDOMNode = $el.find(\".new-webhook-form\")\n addWebhookDOMNode = $el.find(\".add-webhook\")\n initializeNewValue = ->\n $scope.newValue = {\n \"name\": \"\"\n \"url\": \"\"\n \"key\": \"\"\n }\n\n initializeNewValue()\n\n $scope.$watch \"webhooks\", (webhooks) ->\n if webhooks?\n if webhooks.length == 0\n formDOMNode.removeClass(\"hidden\")\n addWebhookDOMNode.addClass(\"hidden\")\n formDOMNode.find(\"input\")[0].focus()\n else\n formDOMNode.addClass(\"hidden\")\n addWebhookDOMNode.removeClass(\"hidden\")\n\n save = debounce 2000, () ->\n form = formDOMNode.checksley()\n return if not form.validate()\n\n $scope.newValue.project = $scope.project.id\n promise = $repo.create(\"webhooks\", $scope.newValue)\n promise.then =>\n $scope.$emit(\"webhooks:reload\")\n initializeNewValue()\n\n promise.then null, (data) ->\n $confirm.notify(\"error\")\n form.setErrors(data)\n\n formDOMNode.on \"click\", \".add-new\", (event) ->\n event.preventDefault()\n save()\n\n formDOMNode.on \"keyup\", \"input\", (event) ->\n if event.keyCode == 13\n save()\n\n formDOMNode.on \"click\", \".cancel-new\", (event) ->\n $scope.$apply ->\n initializeNewValue()\n\n addWebhookDOMNode.on \"click\", (event) ->\n formDOMNode.removeClass(\"hidden\")\n formDOMNode.find(\"input\")[0].focus()\n\n return {link:link}\n\nmodule.directive(\"tgNewWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", NewWebhookDirective])\n\n\n#############################################################################\n## Github Controller\n#############################################################################\n\nclass GithubController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"ADMIN.GITHUB.SECTION_NAME\")\n @scope.project = {}\n\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.GITHUB.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n loadModules: ->\n return @rs.modules.list(@scope.projectId, \"github\").then (github) =>\n @scope.github = github\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then(=> @.loadModules())\n return promise\n\nmodule.controller(\"GithubController\", GithubController)\n\n\n#############################################################################\n## Gitlab Controller\n#############################################################################\n\nclass GitlabController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"ADMIN.GITLAB.SECTION_NAME\")\n @scope.project = {}\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.GITLAB.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"project:modules:reload\", =>\n @.loadModules()\n\n loadModules: ->\n return @rs.modules.list(@scope.projectId, \"gitlab\").then (gitlab) =>\n @scope.gitlab = gitlab\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then(=> @.loadModules())\n return promise\n\nmodule.controller(\"GitlabController\", GitlabController)\n\n\n#############################################################################\n## Bitbucket Controller\n#############################################################################\n\nclass BitbucketController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"ADMIN.BITBUCKET.SECTION_NAME\")\n @scope.project = {}\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.BITBUCKET.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"project:modules:reload\", =>\n @.loadModules()\n\n loadModules: ->\n return @rs.modules.list(@scope.projectId, \"bitbucket\").then (bitbucket) =>\n @scope.bitbucket = bitbucket\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then(=> @.loadModules())\n return promise\n\nmodule.controller(\"BitbucketController\", BitbucketController)\n\n\nSelectInputText = ->\n link = ($scope, $el, $attrs) ->\n $el.on \"click\", \".select-input-content\", () ->\n $el.find(\"input\").select()\n $el.find(\".help-copy\").addClass(\"visible\")\n\n return {link:link}\n\nmodule.directive(\"tgSelectInputText\", SelectInputText)\n\n\n#############################################################################\n## GithubWebhooks Directive\n#############################################################################\n\nGithubWebhooksDirective = ($repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.saveAttribute($scope.github, \"github\")\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link:link}\n\nmodule.directive(\"tgGithubWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", GithubWebhooksDirective])\n\n\n#############################################################################\n## GitlabWebhooks Directive\n#############################################################################\n\nGitlabWebhooksDirective = ($repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.saveAttribute($scope.gitlab, \"gitlab\")\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n $scope.$emit(\"project:modules:reload\")\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link:link}\n\nmodule.directive(\"tgGitlabWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", GitlabWebhooksDirective])\n\n\n#############################################################################\n## BitbucketWebhooks Directive\n#############################################################################\n\nBitbucketWebhooksDirective = ($repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.saveAttribute($scope.bitbucket, \"bitbucket\")\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n $scope.$emit(\"project:modules:reload\")\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link:link}\n\nmodule.directive(\"tgBitbucketWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", BitbucketWebhooksDirective])\n\n\n#############################################################################\n## Valid Origin IP's Directive\n#############################################################################\nValidOriginIpsDirective = ->\n link = ($scope, $el, $attrs, $ngModel) ->\n $ngModel.$parsers.push (value) ->\n value = $.trim(value)\n if value == \"\"\n return []\n\n return value.split(\",\")\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgValidOriginIps\", ValidOriginIpsDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/attachments.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ntimeout = @.taiga.timeout\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaProject\")\n\nCreateProject = ($rootscope, $repo, $confirm, $location, $navurls, $rs, $projectUrl, $loading, lightboxService, $cacheFactory, $translate, currentUserService) ->\n link = ($scope, $el, attrs) ->\n $scope.data = {}\n $scope.templates = []\n currentLoading = null\n\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n\n onSuccessSubmit = (response) ->\n # remove all $http cache\n # This is necessary when a project is created with the same name\n # than another deleted in the same session\n $cacheFactory.get('$http').removeAll()\n\n currentLoading.finish()\n $rootscope.$broadcast(\"projects:reload\")\n\n $confirm.notify(\"success\", $translate.instant(\"COMMON.SAVE\"))\n\n $location.url($projectUrl.get(response))\n lightboxService.close($el)\n currentUserService.loadProjects()\n\n onErrorSubmit = (response) ->\n currentLoading.finish()\n form.setErrors(response)\n selectors = []\n for error_field in _.keys(response)\n selectors.push(\"[name=#{error_field}]\")\n $el.find(\".active\").removeClass(\"active\")\n error_step = $el.find(selectors.join(\",\")).first().parents(\".wizard-step\")\n error_step.addClass(\"active\")\n $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(error_step.data(\"step\"))\n\n submit = (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.create(\"projects\", $scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n openLightbox = ->\n $scope.data = {}\n\n if !$scope.templates.length\n $rs.projects.templates().then (result) =>\n $scope.templates = result\n $scope.data.creation_template = _.head(_.filter($scope.templates, (x) -> x.slug == \"scrum\")).id\n else\n $scope.data.creation_template = _.head(_.filter($scope.templates, (x) -> x.slug == \"scrum\")).id\n\n $el.find(\".active\").removeClass(\"active\")\n $el.find(\".create-step1\").addClass(\"active\")\n\n lightboxService.open($el)\n timeout 600, ->\n $el.find(\".progress-bar\").addClass('step1')\n\n $el.on \"click\", \".button-next\", (event) ->\n event.preventDefault()\n\n current = $el.find(\".active\")\n\n valid = true\n for field in form.fields\n if current.find(\"[name=#{field.element.attr('name')}]\").length\n valid = field.validate() != false and valid\n\n if not valid\n return\n\n next = current.next()\n current.toggleClass('active')\n next.toggleClass('active')\n step = next.data('step')\n $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(step)\n\n $el.on \"click\", \".button-prev\", (event) ->\n event.preventDefault()\n current = $el.find(\".active\")\n prev = current.prev()\n current.toggleClass('active')\n prev.toggleClass('active')\n step = prev.data('step')\n $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(step)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n lightboxService.close($el)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n openLightbox()\n\n directive = {\n link: link,\n templateUrl: \"project/wizard-create-project.html\"\n scope: {}\n }\n\n return directive\n\n\nmodule.directive(\"tgLbCreateProject\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\",\n \"$location\", \"$tgNavUrls\", \"$tgResources\", \"$projectUrl\", \"$tgLoading\",\n \"lightboxService\", \"$cacheFactory\", \"$translate\", \"tgCurrentUserService\", CreateProject])\n\n\n#############################################################################\n## Delete Project Lightbox Directive\n#############################################################################\n\nDeleteProjectDirective = ($repo, $rootscope, $auth, $location, $navUrls, $confirm, lightboxService, tgLoader, currentUserService) ->\n link = ($scope, $el, $attrs) ->\n projectToDelete = null\n $scope.$on \"deletelightbox:new\", (ctx, project)->\n lightboxService.open($el)\n projectToDelete = project\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n submit = ->\n tgLoader.start()\n lightboxService.close($el)\n\n promise = $repo.remove(projectToDelete)\n\n promise.then (data) ->\n tgLoader.pageLoaded()\n $rootscope.$broadcast(\"projects:reload\")\n $location.path($navUrls.resolve(\"home\"))\n $confirm.notify(\"success\")\n currentUserService.loadProjects()\n\n # FIXME: error handling?\n promise.then null, ->\n $confirm.notify(\"error\")\n lightboxService.close($el)\n\n $el.on \"click\", \".button-red\", (event) ->\n event.preventDefault()\n lightboxService.close($el)\n\n $el.on \"click\", \".button-green\", (event) ->\n event.preventDefault()\n submit()\n\n return {link:link}\n\nmodule.directive(\"tgLbDeleteProject\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\",\n \"$tgConfirm\", \"lightboxService\", \"tgLoader\", \"tgCurrentUserService\", DeleteProjectDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/bind.coffee\n###\n\nbindOnce = @.taiga.bindOnce\n\n# Escape Html bind once directive\nBindOnceBindDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoBind, (val) ->\n $el.text(val)\n\n return {link:link}\n\n# Html bind once directive\nBindOnceHtmlDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoHtml, (val) ->\n $el.html(val)\n\n return {link:link}\n\n# Object reference bind once helper.\nBindOnceRefDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoRef, (val) ->\n $el.html(\"##{val} \")\n return {link:link}\n\n# Object src bind once helper.\nBindOnceSrcDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoSrc, (val) ->\n $el.attr(\"src\", val)\n return {link:link}\n\n# Object href bind once helper.\nBindOnceHrefDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoHref, (val) ->\n $el.attr(\"href\", val)\n return {link:link}\n\n# Object alt bind once helper.\nBindOnceAltDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoAlt, (val) ->\n $el.attr(\"alt\", val)\n return {link:link}\n\n# Object title bind once helper.\nBindOnceTitleDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoTitle, (val) ->\n $el.attr(\"title\", val)\n return {link:link}\n\nBindTitleDirective = ->\n link = ($scope, $el, $attrs) ->\n $scope.$watch $attrs.tgTitleHtml, (val) ->\n $el.attr(\"title\", val) if val?\n\n return {link:link}\n\nBindHtmlDirective = ->\n link = ($scope, $el, $attrs) ->\n $scope.$watch $attrs.tgBindHtml, (val) ->\n $el.html(val) if val?\n\n return {link:link}\n\nmodule = angular.module(\"taigaBase\")\nmodule.directive(\"tgBoBind\", BindOnceBindDirective)\nmodule.directive(\"tgBoHtml\", BindOnceHtmlDirective)\nmodule.directive(\"tgBoRef\", BindOnceRefDirective)\nmodule.directive(\"tgBoSrc\", BindOnceSrcDirective)\nmodule.directive(\"tgBoHref\", BindOnceHrefDirective)\nmodule.directive(\"tgBoAlt\", BindOnceAltDirective)\nmodule.directive(\"tgBoTitle\", BindOnceTitleDirective)\nmodule.directive(\"tgBindTitle\", BindTitleDirective)\nmodule.directive(\"tgBindHtml\", BindHtmlDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/conf.coffee\n###\n\nclass ConfigurationService\n constructor: () ->\n @.config = window.taigaConfig\n\n get: (key, defaultValue=null) ->\n if _.has(@.config, key)\n return @.config[key]\n return defaultValue\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service(\"$tgConfig\", ConfigurationService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/contrib.coffee\n###\n\ntaigaContribPlugins = @.taigaContribPlugins = @.taigaContribPlugins or []\n\nclass ContribController extends taiga.Controller\n @.$inject = [\n \"$rootScope\",\n \"$scope\",\n \"$routeParams\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$tgConfirm\"\n ]\n\n constructor: (@rootScope, @scope, @params, @repo, @rs, @confirm) ->\n @scope.adminPlugins = _.where(@rootScope.contribPlugins, {\"type\": \"admin\"})\n @scope.currentPlugin = _.first(_.where(@scope.adminPlugins, {\"slug\": @params.plugin}))\n @scope.pluginTemplate = \"contrib/#{@scope.currentPlugin.slug}\"\n @scope.projectSlug = @params.pslug\n\n promise = @.loadInitialData()\n\n promise.then null, =>\n @confirm.notify(\"error\")\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.$broadcast('project:loaded', project)\n return project\n\n loadInitialData: ->\n return @.loadProject()\n\nmodule = angular.module(\"taigaBase\")\nmodule.controller(\"ContribController\", ContribController)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/filters.coffee\n###\n\n\ntaiga = @.taiga\n\nclass FiltersStorageService extends taiga.Service\n @.$inject = [\"$tgStorage\", \"$routeParams\"]\n\n constructor: (@storage, @params) ->\n\n generateHash: (components=[]) ->\n components = _.map(components, (x) -> JSON.stringify(x))\n return hex_sha1(components.join(\":\"))\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/http.coffee\n###\n\ntaiga = @.taiga\n\nclass HttpService extends taiga.Service\n @.$inject = [\"$http\", \"$q\", \"$tgStorage\", \"$rootScope\", \"$cacheFactory\", \"$translate\"]\n\n constructor: (@http, @q, @storage, @rootScope, @cacheFactory, @translate) ->\n super()\n\n @.cache = @cacheFactory(\"httpget\");\n headers: ->\n headers = {}\n\n # Authorization\n token = @storage.get('token')\n if token\n headers[\"Authorization\"] = \"Bearer #{token}\"\n\n # Accept-Language\n lang = @translate.preferredLanguage()\n if lang\n headers[\"Accept-Language\"] = lang\n\n return headers\n\n request: (options) ->\n options.headers = _.merge({}, options.headers or {}, @.headers())\n if _.isPlainObject(options.data)\n options.data = JSON.stringify(options.data)\n\n return @http(options)\n\n get: (url, params, options) ->\n options = _.merge({method: \"GET\", url: url}, options)\n options.params = params if params\n\n # prevent duplicated http request\n options.cache = @.cache\n\n return @.request(options).finally (data) =>\n @.cache.removeAll()\n\n post: (url, data, params, options) ->\n options = _.merge({method: \"POST\", url: url}, options)\n options.data = data if data\n options.params = params if params\n return @.request(options)\n\n put: (url, data, params, options) ->\n options = _.merge({method: \"PUT\", url: url}, options)\n options.data = data if data\n options.params = params if params\n return @.request(options)\n\n patch: (url, data, params, options) ->\n options = _.merge({method: \"PATCH\", url: url}, options)\n options.data = data if data\n options.params = params if params\n return @.request(options)\n\n delete: (url, data, params, options) ->\n options = _.merge({method: \"DELETE\", url: url}, options)\n options.data = data if data\n options.params = params if params\n return @.request(options)\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service(\"$tgHttp\", HttpService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/location.coffee\n###\n\n\nlocationFactory = ($location, $route, $rootscope) ->\n $location.noreload = (scope) ->\n lastRoute = $route.current\n un = scope.$on \"$locationChangeSuccess\", ->\n $route.current = lastRoute\n un()\n\n return $location\n\n $location.isInCurrentRouteParams = (name, value) ->\n params = $location.search() || {}\n\n return params[name] == value\n\n return $location\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.factory(\"$tgLocation\", [\"$location\", \"$route\", \"$rootScope\", locationFactory])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/model.coffee\n###\n\nclass Model\n constructor: (name, data, dataTypes) ->\n @._attrs = data\n @._name = name\n @._dataTypes = dataTypes\n\n @.setAttrs(data)\n @.initialize()\n\n clone: ->\n instance = new Model(@._name, @._attrs, @._dataTypes)\n instance._modifiedAttrs = @._modifiedAttrs\n instance._isModified = @._isModified\n return instance\n\n applyCasts: ->\n for attrName, castName of @._dataTypes\n castMethod = service.casts[castName]\n if not castMethod\n continue\n\n @._attrs[attrName] = castMethod(@._attrs[attrName])\n\n getIdAttrName: ->\n return \"id\"\n\n getName: ->\n return @._name\n\n getAttrs: (patch=false) ->\n if @._attrs.version?\n @._modifiedAttrs.version = @._attrs.version\n\n if patch\n return _.extend({}, @._modifiedAttrs)\n return _.extend({}, @._attrs, @._modifiedAttrs)\n\n setAttrs: (attrs) ->\n @._attrs = attrs\n @._modifiedAttrs = {}\n\n @.applyCasts()\n @._isModified = false\n\n setAttr: (name, value) ->\n @._modifiedAttrs[name] = value\n @._isModified = true\n\n initialize: () ->\n self = @\n\n getter = (name) ->\n return ->\n if typeof(name) == 'string' and name.substr(0,2) == \"__\"\n return self[name]\n\n if name not in _.keys(self._modifiedAttrs)\n return self._attrs[name]\n\n return self._modifiedAttrs[name]\n\n setter = (name) ->\n return (value) ->\n if typeof(name) == 'string' and name.substr(0,2) == \"__\"\n self[name] = value\n return\n\n if self._attrs[name] != value\n self._modifiedAttrs[name] = value\n self._isModified = true\n else\n delete self._modifiedAttrs[name]\n\n return\n\n _.each @_attrs, (value, name) ->\n options =\n get: getter(name)\n set: setter(name)\n enumerable: true\n configurable: true\n\n Object.defineProperty(self, name, options)\n\n serialize: () ->\n data =\n \"data\": _.clone(@_attrs)\n \"name\": @_name\n\n return JSON.stringify(data)\n\n isModified: ->\n return this._isModified\n\n isAttributeModified: (attribute) ->\n return @._modifiedAttrs[attribute]?\n\n markSaved: () ->\n @._isModified = false\n @._attrs = @.getAttrs()\n @._modifiedAttrs = {}\n\n revert: () ->\n @_modifiedAttrs = {}\n @_isModified = false\n\n @desSerialize = (sdata) ->\n ddata = JSON.parse(sdata)\n model = new Model(ddata.url, ddata.data)\n return model\n\n\ntaiga = @.taiga\n\nclass ModelService extends taiga.Service\n @.$inject = [\"$q\", \"$tgUrls\", \"$tgStorage\", \"$tgHttp\"]\n\n constructor: (@q, @urls, @storage, @http) ->\n super()\n\nprovider = ($q, $http, $gmUrls, $gmStorage) ->\n service = {}\n service.make_model = (name, data, cls=Model, dataTypes={}) ->\n return new cls(name, data, dataTypes)\n\n service.cls = Model\n service.casts = {\n int: (value) ->\n return parseInt(value, 10)\n\n float: (value) ->\n return parseFloat(value, 10)\n }\n\n return service\n\nmodule = angular.module(\"taigaBase\")\nmodule.factory(\"$tgModel\", [\"$q\", \"$http\", \"$tgUrls\", \"$tgStorage\", provider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/navurl.coffee\n###\n\ntaiga = @.taiga\ntrim = @.taiga.trim\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaBase\")\n\n\n#############################################################################\n## Navigation Urls Service\n#############################################################################\n\nclass NavigationUrlsService extends taiga.Service\n constructor: ->\n @.urls = {}\n\n update: (urls) ->\n @.urls = _.merge({}, @.urls, urls or {})\n\n formatUrl: (url, ctx={}) ->\n replacer = (match) ->\n match = trim(match, \":\")\n return ctx[match] or \"undefined\"\n return url.replace(/(:\\w+)/g, replacer)\n\n resolve: (name, ctx) ->\n url = @.urls[name]\n return \"\" if not url\n return @.formatUrl(url, ctx) if ctx\n return url\n\nmodule.service(\"$tgNavUrls\", NavigationUrlsService)\n\n\n#############################################################################\n## Navigation Urls Directive\n#############################################################################\n\nNavigationUrlsDirective = ($navurls, $auth, $q, $location) ->\n # Example:\n # link(tg-nav=\"project-backlog:project='sss',\")\n\n # bindOnce version that uses $q for offer\n # promise based api\n bindOnceP = ($scope, attr) ->\n defered = $q.defer()\n bindOnce $scope, attr, (v) ->\n defered.resolve(v)\n return defered.promise\n\n parseNav = (data, $scope) ->\n [name, params] = _.map(data.split(\":\"), trim)\n if params\n # split by 'xxx='\n # example\n # project=vm.timeline.getIn(['data', 'project', 'slug']), ref=vm.timeline.getIn(['obj', 'ref'])\n # [\"\", \"project\", \"vm.timeline.getIn(['data', 'project', 'slug']), \", \"ref\", \"vm.timeline.getIn(['obj', 'ref'])\"]\n result = params.split(/(\\w+)=/)\n\n # remove empty string\n result = _.filter result, (str) -> return str.length\n\n # remove , at the end of the string\n result = _.map result, (str) -> return trim(str.replace(/,$/g, ''))\n\n params = []\n index = 0\n\n # ['param1', 'value'] => [{'param1': 'value'}]\n while index < result.length\n obj = {}\n obj[result[index]] = result[index + 1]\n params.push obj\n index = index + 2\n else\n params = []\n\n values = _.map params, (param) -> _.values(param)[0]\n promises = _.map(values, (x) -> bindOnceP($scope, x))\n\n return $q.all(promises).then ->\n options = {}\n for param in params\n key = Object.keys(param)[0]\n value = param[key]\n\n options[key] = $scope.$eval(value)\n return [name, options]\n\n link = ($scope, $el, $attrs) ->\n if $el.is(\"a\")\n $el.attr(\"href\", \"#\")\n\n $el.on \"mouseenter\", (event) ->\n target = $(event.currentTarget)\n\n if !target.data(\"fullUrl\")\n parseNav($attrs.tgNav, $scope).then (result) ->\n [name, options] = result\n user = $auth.getUser()\n options.user = user.username if user\n\n url = $navurls.resolve(name)\n fullUrl = $navurls.formatUrl(url, options)\n\n if $attrs.tgNavGetParams\n getURLParams = JSON.parse($attrs.tgNavGetParams)\n getURLParamsStr = $.param(getURLParams)\n fullUrl = \"#{fullUrl}?#{getURLParamsStr}\"\n\n target.data(\"fullUrl\", fullUrl)\n\n if target.is(\"a\")\n target.attr(\"href\", fullUrl)\n\n $el.on \"click\", (event) ->\n if event.metaKey || event.ctrlKey\n return\n\n event.preventDefault()\n target = $(event.currentTarget)\n\n if target.hasClass('noclick')\n return\n\n fullUrl = target.data(\"fullUrl\")\n\n switch event.which\n when 1\n $location.url(fullUrl)\n $scope.$apply()\n when 2\n window.open fullUrl\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgNav\", [\"$tgNavUrls\", \"$tgAuth\", \"$q\", \"$tgLocation\", NavigationUrlsDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/repository.coffee\n###\n\ntaiga = @.taiga\n\nclass RepositoryService extends taiga.Service\n @.$inject = [\"$q\", \"$tgModel\", \"$tgStorage\", \"$tgHttp\", \"$tgUrls\"]\n\n constructor: (@q, @model, @storage, @http, @urls) ->\n super()\n\n resolveUrlForModel: (model) ->\n idAttrName = model.getIdAttrName()\n return \"#{@urls.resolve(model.getName())}/#{model[idAttrName]}\"\n\n resolveUrlForAttributeModel: (model) ->\n return @urls.resolve(model.getName(), model.parent)\n\n create: (name, data, dataTypes={}, extraParams={}) ->\n defered = @q.defer()\n url = @urls.resolve(name)\n\n promise = @http.post(url, JSON.stringify(data))\n promise.success (_data, _status) =>\n defered.resolve(@model.make_model(name, _data, null, dataTypes))\n\n promise.error (data, status) =>\n defered.reject(data)\n\n return defered.promise\n\n remove: (model, params={}) ->\n defered = @q.defer()\n url = @.resolveUrlForModel(model)\n\n promise = @http.delete(url, {}, params)\n promise.success (data, status) ->\n defered.resolve(model)\n\n promise.error (data, status) ->\n defered.reject(model)\n\n return defered.promise\n\n saveAll: (models, patch=true) ->\n promises = _.map(models, (x) => @.save(x, true))\n return @q.all(promises)\n\n save: (model, patch=true) ->\n defered = @q.defer()\n\n if not model.isModified() and patch\n defered.resolve(model)\n return defered.promise\n\n url = @.resolveUrlForModel(model)\n data = JSON.stringify(model.getAttrs(patch))\n\n if patch\n promise = @http.patch(url, data)\n else\n promise = @http.put(url, data)\n\n promise.success (data, status) =>\n model._isModified = false\n model._attrs = _.extend(model.getAttrs(), data)\n model._modifiedAttrs = {}\n\n model.applyCasts()\n defered.resolve(model)\n\n promise.error (data, status) ->\n defered.reject(data)\n\n return defered.promise\n\n saveAttribute: (model, attribute, patch=true) ->\n defered = @q.defer()\n\n if not model.isModified() and patch\n defered.resolve(model)\n return defered.promise\n\n url = @.resolveUrlForAttributeModel(model)\n\n data = {}\n\n data[attribute] = model.getAttrs()\n\n if patch\n promise = @http.patch(url, data)\n else\n promise = @http.put(url, data)\n\n promise.success (data, status) =>\n model._isModified = false\n model._attrs = _.extend(model.getAttrs(), data)\n model._modifiedAttrs = {}\n\n model.applyCasts()\n defered.resolve(model)\n\n promise.error (data, status) ->\n defered.reject(data)\n\n return defered.promise\n\n refresh: (model) ->\n defered = @q.defer()\n\n url = @.resolveUrlForModel(model)\n promise = @http.get(url)\n promise.success (data, status) ->\n model._modifiedAttrs = {}\n model._attrs = data\n model._isModified = false\n model.applyCasts()\n defered.resolve(model)\n\n promise.error (data, status) ->\n defered.reject(data)\n\n return defered.promise\n\n queryMany: (name, params, options={}, headers=false) ->\n url = @urls.resolve(name)\n httpOptions = {headers: {}}\n\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n\n return @http.get(url, params, httpOptions).then (data) =>\n result = _.map(data.data, (x) => @model.make_model(name, x))\n\n if headers\n return [result, data.headers]\n\n return result\n\n queryOneAttribute: (name, id, attribute, params, options={}) ->\n url = @urls.resolve(name, id)\n httpOptions = {headers: {}}\n\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n\n return @http.get(url, params, httpOptions).then (data) =>\n model = @model.make_model(name, data.data[attribute])\n model.parent = id\n\n return model\n\n queryOne: (name, id, params, options={}) ->\n url = @urls.resolve(name)\n url = \"#{url}/#{id}\" if id\n httpOptions = {headers: {}}\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n\n return @http.get(url, params, httpOptions).then (data) =>\n return @model.make_model(name, data.data)\n\n queryOneRaw: (name, id, params, options={}) ->\n url = @urls.resolve(name)\n url = \"#{url}/#{id}\" if id\n httpOptions = _.merge({headers: {}}, options)\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n return @http.get(url, params, httpOptions).then (data) =>\n return data.data\n\n queryPaginated: (name, params, options={}) ->\n url = @urls.resolve(name)\n httpOptions = _.merge({headers: {}}, options)\n return @http.get(url, params, httpOptions).then (data) =>\n headers = data.headers()\n result = {}\n result.models = _.map(data.data, (x) => @model.make_model(name, x))\n result.count = parseInt(headers[\"x-pagination-count\"], 10)\n result.current = parseInt(headers[\"x-pagination-current\"] or 1, 10)\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10)\n return result\n\n queryOnePaginatedRaw: (name, id, params, options={}) ->\n url = @urls.resolve(name)\n url = \"#{url}/#{id}\" if id\n httpOptions = _.merge({headers: {}}, options)\n\n return @http.get(url, params, httpOptions).then (data) =>\n headers = data.headers()\n result = {}\n result.data = data.data\n result.count = parseInt(headers[\"x-pagination-count\"], 10)\n result.current = parseInt(headers[\"x-pagination-current\"] or 1, 10)\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10)\n\n return result\n\n resolve: (options) ->\n params = {}\n params.project = options.pslug if options.pslug?\n params.us = options.usref if options.usref?\n params.task = options.taskref if options.taskref?\n params.issue = options.issueref if options.issueref?\n params.milestone = options.sslug if options.sslug?\n params.wikipage = options.wikipage if options.wikipage?\n\n cache = not (options.wikipage or options.sslug)\n return @.queryOneRaw(\"resolver\", null, params, {cache: cache})\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service(\"$tgRepo\", RepositoryService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/storage.coffee\n###\n\ntaiga = @.taiga\n\nclass StorageService extends taiga.Service\n @.$inject = [\"$rootScope\"]\n\n constructor: ($rootScope) ->\n super()\n\n get: (key, _default) ->\n serializedValue = localStorage.getItem(key)\n if serializedValue == null\n return _default or null\n\n return JSON.parse(serializedValue)\n\n set: (key, val) ->\n if _.isObject(key)\n _.each key, (val, key) =>\n @set(key, val)\n else\n localStorage.setItem(key, JSON.stringify(val))\n\n contains: (key) ->\n value = @.get(key)\n return (value != null)\n\n remove: (key) ->\n localStorage.removeItem(key)\n\n clear: ->\n localStorage.clear()\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service(\"$tgStorage\", StorageService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/http.coffee\n###\n\nformat = (fmt, obj) ->\n obj = _.clone(obj)\n return fmt.replace /%s/g, (match) -> String(obj.shift())\n\ntaiga = @.taiga\n\nclass UrlsService extends taiga.Service\n @.$inject = [\"$tgConfig\"]\n\n constructor: (@config) ->\n @.urls = {}\n @.mainUrl = @config.get(\"api\")\n\n update: (urls) ->\n @.urls = _.merge(@.urls, urls)\n\n resolve: ->\n args = _.toArray(arguments)\n\n if args.length == 0\n throw Error(\"wrong arguments to setUrls\")\n\n name = args.slice(0, 1)[0]\n url = format(@.urls[name], args.slice(1))\n\n return format(\"%s/%s\", [\n _.str.rtrim(@.mainUrl, \"/\"),\n _.str.ltrim(url, \"/\")\n ])\n\n resolveAbsolute: ->\n url = @.resolve.apply(@, arguments)\n if (/^https?:\\/\\//i).test(url)\n return url\n if (/^\\//).test(url)\n return \"#{window.location.protocol}//#{window.location.host}#{url}\"\n return \"#{window.location.protocol}//#{window.location.host}/#{url}\"\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service('$tgUrls', UrlsService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/attachments.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($rootScope, $config, $urls, $model, $repo, $auth, $q) ->\n service = {}\n\n service.list = (urlName, objectId, projectId) ->\n params = {object_id: objectId, project: projectId}\n return $repo.queryMany(urlName, params)\n\n service.create = (urlName, projectId, objectId, file) ->\n defered = $q.defer()\n\n if file is undefined\n defered.reject(null)\n return defered.promise\n\n maxFileSize = $config.get(\"maxUploadFileSize\", null)\n if maxFileSize and file.size > maxFileSize\n response = {\n status: 413,\n data: _error_message: \"'#{file.name}' (#{sizeFormat(file.size)}) is too heavy for our oompa\n loompas, try it with a smaller than (#{sizeFormat(maxFileSize)})\"\n }\n defered.reject(response)\n return defered.promise\n\n uploadProgress = (evt) =>\n $rootScope.$apply =>\n file.status = \"in-progress\"\n file.size = sizeFormat(evt.total)\n file.progressMessage = \"upload #{sizeFormat(evt.loaded)} of #{sizeFormat(evt.total)}\"\n file.progressPercent = \"#{Math.round((evt.loaded / evt.total) * 100)}%\"\n\n uploadComplete = (evt) =>\n $rootScope.$apply ->\n file.status = \"done\"\n\n status = evt.target.status\n try\n data = JSON.parse(evt.target.responseText)\n catch\n data = {}\n\n if status >= 200 and status < 400\n model = $model.make_model(urlName, data)\n defered.resolve(model)\n else\n response = {\n status: status,\n data: {_error_message: data['attached_file']?[0]}\n }\n defered.reject(response)\n\n uploadFailed = (evt) =>\n $rootScope.$apply ->\n file.status = \"error\"\n defered.reject(\"fail\")\n\n data = new FormData()\n data.append(\"project\", projectId)\n data.append(\"object_id\", objectId)\n data.append(\"attached_file\", file)\n\n xhr = new XMLHttpRequest()\n xhr.upload.addEventListener(\"progress\", uploadProgress, false)\n xhr.addEventListener(\"load\", uploadComplete, false)\n xhr.addEventListener(\"error\", uploadFailed, false)\n\n xhr.open(\"POST\", $urls.resolve(urlName))\n xhr.setRequestHeader(\"Authorization\", \"Bearer #{$auth.getToken()}\")\n xhr.setRequestHeader('Accept', 'application/json')\n xhr.send(data)\n\n return defered.promise\n\n return (instance) ->\n instance.attachments = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgAttachmentsResourcesProvider\", [\"$rootScope\", \"$tgConfig\", \"$tgUrls\", \"$tgModel\", \"$tgRepo\",\n \"$tgAuth\", \"$q\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/custom-field-values.coffee\n###\n\ntaiga = @.taiga\n\nresourceProvider = ($repo) ->\n _get = (objectId, resource) ->\n return $repo.queryOne(resource, objectId)\n\n service = {\n userstory: {\n get: (objectId) -> _get(objectId, \"custom-attributes-values/userstory\")\n }\n task: {\n get: (objectId) -> _get(objectId, \"custom-attributes-values/task\")\n }\n issue: {\n get: (objectId) -> _get(objectId, \"custom-attributes-values/issue\")\n }\n }\n\n return (instance) ->\n instance.customAttributesValues = service\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgCustomAttributesValuesResourcesProvider\", [\"$tgRepo\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/projects.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($repo) ->\n _list = (projectId, resource) ->\n return $repo.queryMany(resource, {project: projectId})\n\n service = {\n userstory:{\n list: (projectId) -> _list(projectId, \"custom-attributes/userstory\")\n }\n task:{\n list: (projectId) -> _list(projectId, \"custom-attributes/task\")\n }\n issue: {\n list: (projectId) -> _list(projectId, \"custom-attributes/issue\")\n }\n }\n\n return (instance) ->\n instance.customAttributes = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgCustomAttributesResourcesProvider\", [\"$tgRepo\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/history.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (type, objectId) ->\n return $repo.queryOneRaw(\"history/#{type}\", objectId)\n\n service.deleteComment = (type, objectId, activityId) ->\n url = $urls.resolve(\"history/#{type}\")\n url = \"#{url}/#{objectId}/delete_comment\"\n params = {id: activityId}\n return $http.post(url, null, params).then (data) =>\n return data.data\n\n service.undeleteComment = (type, objectId, activityId) ->\n url = $urls.resolve(\"history/#{type}\")\n url = \"#{url}/#{objectId}/undelete_comment\"\n params = {id: activityId}\n return $http.post(url, null, params).then (data) =>\n return data.data\n\n return (instance) ->\n instance.history = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgHistoryResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/projects.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo) ->\n service = {}\n\n service.get = (token) ->\n return $repo.queryOne(\"invitations\", token)\n\n return (instance) ->\n instance.invitations = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgInvitationsResourcesProvider\", [\"$tgRepo\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/issues.coffee\n###\n\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($repo, $http, $urls, $storage, $q) ->\n service = {}\n hashSuffix = \"issues-queryparams\"\n filtersHashSuffix = \"issues-filters\"\n myFiltersHashSuffix = \"issues-my-filters\"\n\n service.get = (projectId, issueId) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n return $repo.queryOne(\"issues\", issueId, params)\n\n service.getByRef = (projectId, ref) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n params.ref = ref\n return $repo.queryOne(\"issues\", \"by_ref\", params)\n\n service.listInAllProjects = (filters) ->\n return $repo.queryMany(\"issues\", filters)\n\n service.list = (projectId, filters, options) ->\n params = {project: projectId}\n params = _.extend({}, params, filters or {})\n service.storeQueryParams(projectId, params)\n return $repo.queryPaginated(\"issues\", params, options)\n\n service.bulkCreate = (projectId, data) ->\n url = $urls.resolve(\"bulk-create-issues\")\n params = {project_id: projectId, bulk_issues: data}\n return $http.post(url, params)\n\n service.upvote = (issueId) ->\n url = $urls.resolve(\"issue-upvote\", issueId)\n return $http.post(url)\n\n service.downvote = (issueId) ->\n url = $urls.resolve(\"issue-downvote\", issueId)\n return $http.post(url)\n\n service.watch = (issueId) ->\n url = $urls.resolve(\"issue-watch\", issueId)\n return $http.post(url)\n\n service.unwatch = (issueId) ->\n url = $urls.resolve(\"issue-unwatch\", issueId)\n return $http.post(url)\n\n service.stats = (projectId) ->\n return $repo.queryOneRaw(\"projects\", \"#{projectId}/issues_stats\")\n\n service.filtersData = (params) ->\n return $repo.queryOneRaw(\"issues-filters\", null, params)\n\n service.listValues = (projectId, type) ->\n params = {\"project\": projectId}\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(type, params)\n\n service.storeQueryParams = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getQueryParams = (projectId) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeFilters = (projectSlug, params) ->\n ns = \"#{projectSlug}:#{filtersHashSuffix}\"\n hash = generateHash([projectSlug, ns])\n $storage.set(hash, params)\n\n service.getFilters = (projectSlug) ->\n ns = \"#{projectSlug}:#{filtersHashSuffix}\"\n hash = generateHash([projectSlug, ns])\n return $storage.get(hash) or {}\n\n service.storeMyFilters = (projectId, myFilters) ->\n deferred = $q.defer()\n url = $urls.resolve(\"user-storage\")\n ns = \"#{projectId}:#{myFiltersHashSuffix}\"\n hash = generateHash([projectId, ns])\n if _.isEmpty(myFilters)\n promise = $http.delete(\"#{url}/#{hash}\", {key: hash, value:myFilters})\n promise.then ->\n deferred.resolve()\n promise.then null, ->\n deferred.reject()\n else\n promise = $http.put(\"#{url}/#{hash}\", {key: hash, value:myFilters})\n promise.then (data) ->\n deferred.resolve()\n promise.then null, (data) ->\n innerPromise = $http.post(\"#{url}\", {key: hash, value:myFilters})\n innerPromise.then ->\n deferred.resolve()\n innerPromise.then null, ->\n deferred.reject()\n return deferred.promise\n\n service.getMyFilters = (projectId) ->\n deferred = $q.defer()\n url = $urls.resolve(\"user-storage\")\n ns = \"#{projectId}:#{myFiltersHashSuffix}\"\n hash = generateHash([projectId, ns])\n\n promise = $http.get(\"#{url}/#{hash}\")\n promise.then (data) ->\n deferred.resolve(data.data.value)\n promise.then null, (data) ->\n deferred.resolve({})\n\n return deferred.promise\n\n return (instance) ->\n instance.issues = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgIssuesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", \"$q\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/kanban.coffee\n###\n\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($storage) ->\n service = {}\n hashSuffixStatusViewModes = \"kanban-statusviewmodels\"\n hashSuffixStatusColumnModes = \"kanban-statuscolumnmodels\"\n\n service.storeStatusViewModes = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffixStatusViewModes}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getStatusViewModes = (projectId) ->\n ns = \"#{projectId}:#{hashSuffixStatusViewModes}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeStatusColumnModes = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffixStatusColumnModes}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getStatusColumnModes = (projectId) ->\n ns = \"#{projectId}:#{hashSuffixStatusColumnModes}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n return (instance) ->\n instance.kanban = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgKanbanResourcesProvider\", [\"$tgStorage\", resourceProvider])\n","###\n# Copyright (C) 2015 Andrey Antukh \n# Copyright (C) 2015 Jesús Espino Garcia \n# Copyright (C) 2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/locales.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($repo) ->\n service = {\n list: -> return $repo.queryMany(\"locales\")\n }\n\n return (instance) ->\n instance.locales = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgLocalesResourcesProvider\", [\"$tgRepo\", resourceProvider])\n\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/mdrender.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $urls, $http) ->\n service = {}\n\n service.render = (projectId, content) ->\n # We can't use an empty content\n content = ' ' if not content? or content == \"\"\n\n params = {\n project_id: projectId\n content: content\n }\n url = $urls.resolve(\"wiki\")\n return $http.post(\"#{url}/render\", params).then (data) =>\n return data.data\n\n return (instance) ->\n instance.mdrender = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgMdRenderResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/memberships.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (id) ->\n return $repo.queryOne(\"memberships\", id)\n\n service.list = (projectId, filters, enablePagination=true) ->\n params = {project: projectId}\n params = _.extend({}, params, filters or {})\n if enablePagination\n return $repo.queryPaginated(\"memberships\", params)\n\n return $repo.queryMany(\"memberships\", params, options={enablePagination:enablePagination})\n\n service.listByUser = (userId, filters) ->\n params = {user: userId}\n params = _.extend({}, params, filters or {})\n return $repo.queryPaginated(\"memberships\", params)\n\n service.resendInvitation = (id) ->\n url = $urls.resolve(\"memberships\")\n return $http.post(\"#{url}/#{id}/resend_invitation\", {})\n\n service.bulkCreateMemberships = (projectId, data, invitation_extra_text) ->\n url = $urls.resolve(\"bulk-create-memberships\")\n params = {project_id: projectId, bulk_memberships: data, invitation_extra_text: invitation_extra_text}\n return $http.post(url, params)\n\n return (instance) ->\n instance.memberships = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgMembershipsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules.coffee\n###\n\nresourceProvider = ($repo) ->\n service = {}\n\n service.list = (projectId, module) ->\n return $repo.queryOneAttribute(\"project-modules\", projectId, module)\n\n return (instance) ->\n instance.modules = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgModulesResourcesProvider\", [\"$tgRepo\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/memberships.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (id) ->\n return $repo.queryOne(\"notify-policies\", id)\n\n service.list = (filters) ->\n params = _.extend({}, params, filters or {})\n return $repo.queryMany(\"notify-policies\", params)\n\n return (instance) ->\n instance.notifyPolicies = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgNotifyPoliciesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/projects.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($config, $repo, $http, $urls, $auth, $q, $translate) ->\n service = {}\n\n service.get = (projectId) ->\n return $repo.queryOne(\"projects\", projectId)\n\n service.getBySlug = (projectSlug) ->\n return $repo.queryOne(\"projects\", \"by_slug?slug=#{projectSlug}\")\n\n service.list = ->\n return $repo.queryMany(\"projects\")\n\n service.listByMember = (memberId) ->\n params = {\"member\": memberId, \"order_by\": \"memberships__user_order\"}\n return $repo.queryMany(\"projects\", params)\n\n service.templates = ->\n return $repo.queryMany(\"project-templates\")\n\n service.usersList = (projectId) ->\n params = {\"project\": projectId}\n return $repo.queryMany(\"users\", params)\n\n service.rolesList = (projectId) ->\n params = {\"project\": projectId}\n return $repo.queryMany(\"roles\", params)\n\n service.stats = (projectId) ->\n return $repo.queryOneRaw(\"projects\", \"#{projectId}/stats\")\n\n service.bulkUpdateOrder = (bulkData) ->\n url = $urls.resolve(\"bulk-update-projects-order\")\n return $http.post(url, bulkData)\n\n service.regenerate_userstories_csv_uuid = (projectId) ->\n url = \"#{$urls.resolve(\"projects\")}/#{projectId}/regenerate_userstories_csv_uuid\"\n return $http.post(url)\n\n service.regenerate_issues_csv_uuid = (projectId) ->\n url = \"#{$urls.resolve(\"projects\")}/#{projectId}/regenerate_issues_csv_uuid\"\n return $http.post(url)\n\n service.regenerate_tasks_csv_uuid = (projectId) ->\n url = \"#{$urls.resolve(\"projects\")}/#{projectId}/regenerate_tasks_csv_uuid\"\n return $http.post(url)\n\n service.leave = (projectId) ->\n url = \"#{$urls.resolve(\"projects\")}/#{projectId}/leave\"\n return $http.post(url)\n\n service.memberStats = (projectId) ->\n return $repo.queryOneRaw(\"projects\", \"#{projectId}/member_stats\")\n\n service.tagsColors = (projectId) ->\n return $repo.queryOne(\"projects\", \"#{projectId}/tags_colors\")\n\n service.export = (projectId) ->\n url = \"#{$urls.resolve(\"exporter\")}/#{projectId}\"\n return $http.get(url)\n\n service.import = (file, statusUpdater) ->\n defered = $q.defer()\n\n maxFileSize = $config.get(\"maxUploadFileSize\", null)\n if maxFileSize and file.size > maxFileSize\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name\n fileSize: sizeFormat(file.size)\n maxFileSize: sizeFormat(maxFileSize)\n })\n\n response = {\n status: 413,\n data: _error_message: errorMsg\n }\n defered.reject(response)\n return defered.promise\n\n uploadProgress = (evt) =>\n percent = Math.round((evt.loaded / evt.total) * 100)\n message = $translate.instant(\"PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE\", {\n uploadedSize: sizeFormat(evt.loaded)\n totalSize: sizeFormat(evt.total)\n })\n statusUpdater(\"in-progress\", null, message, percent)\n\n uploadComplete = (evt) =>\n statusUpdater(\"done\",\n $translate.instant(\"PROJECT.IMPORT.TITLE\"),\n $translate.instant(\"PROJECT.IMPORT.DESCRIPTION\"))\n\n uploadFailed = (evt) =>\n statusUpdater(\"error\")\n\n complete = (evt) =>\n response = {}\n try\n response.data = JSON.parse(evt.target.responseText)\n catch\n response.data = {}\n response.status = evt.target.status\n\n defered.resolve(response) if response.status in [201, 202]\n defered.reject(response)\n\n failed = (evt) =>\n defered.reject(\"fail\")\n\n data = new FormData()\n data.append('dump', file)\n\n xhr = new XMLHttpRequest()\n xhr.upload.addEventListener(\"progress\", uploadProgress, false)\n xhr.upload.addEventListener(\"load\", uploadComplete, false)\n xhr.upload.addEventListener(\"error\", uploadFailed, false)\n xhr.upload.addEventListener(\"abort\", uploadFailed, false)\n xhr.addEventListener(\"load\", complete, false)\n xhr.addEventListener(\"error\", failed, false)\n\n xhr.open(\"POST\", $urls.resolve(\"importer\"))\n xhr.setRequestHeader(\"Authorization\", \"Bearer #{$auth.getToken()}\")\n xhr.setRequestHeader('Accept', 'application/json')\n xhr.send(data)\n\n return defered.promise\n\n return (instance) ->\n instance.projects = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgProjectsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgAuth\",\n \"$q\", \"$translate\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/memberships.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (id) ->\n return $repo.queryOne(\"roles\", id)\n\n service.list = (projectId) ->\n return $repo.queryMany(\"roles\", {project: projectId})\n\n return (instance) ->\n instance.roles = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgRolesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/search.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $urls, $http) ->\n service = {}\n\n service.do = (projectId, term) ->\n url = $urls.resolve(\"search\")\n params = {\n project: projectId\n text: term,\n get_all: false\n }\n\n return $http.get(url, params).then (data) ->\n return data.data\n\n return (instance) ->\n instance.search = service\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgSearchResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/sprints.coffee\n###\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($repo, $model, $storage) ->\n service = {}\n\n service.get = (projectId, sprintId) ->\n return $repo.queryOne(\"milestones\", sprintId).then (sprint) ->\n uses = sprint.user_stories\n uses = _.map(uses, (u) -> $model.make_model(\"userstories\", u))\n sprint._attrs.user_stories = uses\n return sprint\n\n service.stats = (projectId, sprintId) ->\n return $repo.queryOneRaw(\"milestones\", \"#{sprintId}/stats\")\n\n service.list = (projectId, filters) ->\n params = {\"project\": projectId}\n params = _.extend({}, params, filters or {})\n return $repo.queryMany(\"milestones\", params, {}, true).then (result) =>\n milestones = result[0]\n headers = result[1]\n\n for m in milestones\n uses = m.user_stories\n uses = _.map(uses, (u) => $model.make_model(\"userstories\", u))\n m._attrs.user_stories = uses\n\n return {\n milestones: milestones,\n closed: parseInt(headers(\"Taiga-Info-Total-Closed-Milestones\"), 10),\n open: parseInt(headers(\"Taiga-Info-Total-Opened-Milestones\"), 10)\n }\n\n\n return (instance) ->\n instance.sprints = service\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgSprintsResourcesProvider\", [\"$tgRepo\", \"$tgModel\", \"$tgStorage\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/tasks.coffee\n###\n\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($repo, $http, $urls, $storage) ->\n service = {}\n hashSuffix = \"tasks-queryparams\"\n hashSuffixStatusColumnModes = \"tasks-statuscolumnmodels\"\n hashSuffixUsRowModes = \"tasks-usrowmodels\"\n\n service.get = (projectId, taskId) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n return $repo.queryOne(\"tasks\", taskId, params)\n\n service.getByRef = (projectId, ref) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n params.ref = ref\n return $repo.queryOne(\"tasks\", \"by_ref\", params)\n\n service.listInAllProjects = (filters) ->\n return $repo.queryMany(\"tasks\", filters)\n\n service.list = (projectId, sprintId=null, userStoryId=null) ->\n params = {project: projectId}\n params.milestone = sprintId if sprintId\n params.user_story = userStoryId if userStoryId\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(\"tasks\", params)\n\n service.bulkCreate = (projectId, sprintId, usId, data) ->\n url = $urls.resolve(\"bulk-create-tasks\")\n params = {project_id: projectId, sprint_id: sprintId, us_id: usId, bulk_tasks: data}\n return $http.post(url, params).then (result) ->\n return result.data\n\n service.upvote = (taskId) ->\n url = $urls.resolve(\"task-upvote\", taskId)\n return $http.post(url)\n\n service.downvote = (taskId) ->\n url = $urls.resolve(\"task-downvote\", taskId)\n return $http.post(url)\n\n service.watch = (taskId) ->\n url = $urls.resolve(\"task-watch\", taskId)\n return $http.post(url)\n\n service.unwatch = (taskId) ->\n url = $urls.resolve(\"task-unwatch\", taskId)\n return $http.post(url)\n\n service.bulkUpdateTaskTaskboardOrder = (projectId, data) ->\n url = $urls.resolve(\"bulk-update-task-taskboard-order\")\n params = {project_id: projectId, bulk_tasks: data}\n return $http.post(url, params)\n\n service.listValues = (projectId, type) ->\n params = {\"project\": projectId}\n return $repo.queryMany(type, params)\n\n service.storeQueryParams = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getQueryParams = (projectId) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeStatusColumnModes = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffixStatusColumnModes}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getStatusColumnModes = (projectId) ->\n ns = \"#{projectId}:#{hashSuffixStatusColumnModes}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeUsRowModes = (projectId, sprintId, params) ->\n ns = \"#{projectId}:#{hashSuffixUsRowModes}\"\n hash = generateHash([projectId, sprintId, ns])\n\n $storage.set(hash, params)\n\n service.getUsRowModes = (projectId, sprintId) ->\n ns = \"#{projectId}:#{hashSuffixUsRowModes}\"\n hash = generateHash([projectId, sprintId, ns])\n\n return $storage.get(hash) or {}\n\n return (instance) ->\n instance.tasks = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgTasksResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/memberships.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($config, $repo, $http, $urls, $q) ->\n service = {}\n\n service.changeAvatar = (file) ->\n maxFileSize = $config.get(\"maxUploadFileSize\", null)\n if maxFileSize and file.size > maxFileSize\n response = {\n status: 413,\n data: _error_message: \"'#{file.name}' (#{sizeFormat(file.size)}) is too heavy for our oompa\n loompas, try it with a smaller than (#{sizeFormat(maxFileSize)})\"\n }\n defered = $q.defer()\n defered.reject(response)\n return defered.promise\n\n data = new FormData()\n data.append('avatar', file)\n options = {\n transformRequest: angular.identity,\n headers: {'Content-Type': undefined}\n }\n url = \"#{$urls.resolve(\"users\")}/change_avatar\"\n return $http.post(url, data, {}, options)\n\n service.removeAvatar = () ->\n url = \"#{$urls.resolve(\"users\")}/remove_avatar\"\n return $http.post(url)\n\n service.changePassword = (currentPassword, newPassword) ->\n url = \"#{$urls.resolve(\"users\")}/change_password\"\n data = {\n current_password: currentPassword\n password: newPassword\n }\n return $http.post(url, data)\n\n return (instance) ->\n instance.userSettings = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgUserSettingsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$q\",\n resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/user.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($http, $urls) ->\n service = {}\n\n service.contacts = (userId, options={}) ->\n url = $urls.resolve(\"user-contacts\", userId)\n httpOptions = {headers: {}}\n\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n\n return $http.get(url, {}, httpOptions)\n .then (result) ->\n return result.data\n\n return (instance) ->\n instance.users = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgUsersResourcesProvider\", [\"$tgHttp\", \"$tgUrls\", \"$q\",\n resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/userstories.coffee\n###\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($repo, $http, $urls, $storage) ->\n service = {}\n hashSuffix = \"userstories-queryparams\"\n\n service.get = (projectId, usId) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n return $repo.queryOne(\"userstories\", usId, params)\n\n service.getByRef = (projectId, ref) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n params.ref = ref\n return $repo.queryOne(\"userstories\", \"by_ref\", params)\n\n service.listInAllProjects = (filters) ->\n return $repo.queryMany(\"userstories\", filters)\n\n service.filtersData = (params) ->\n return $repo.queryOneRaw(\"userstories-filters\", null, params)\n\n service.listUnassigned = (projectId, filters) ->\n params = {\"project\": projectId, \"milestone\": \"null\"}\n params = _.extend({}, params, filters or {})\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(\"userstories\", params)\n\n service.listAll = (projectId, filters) ->\n params = {\"project\": projectId}\n params = _.extend({}, params, filters or {})\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(\"userstories\", params)\n\n service.bulkCreate = (projectId, status, bulk) ->\n data = {\n project_id: projectId\n status_id: status\n bulk_stories: bulk\n }\n\n url = $urls.resolve(\"bulk-create-us\")\n\n return $http.post(url, data)\n\n service.upvote = (userStoryId) ->\n url = $urls.resolve(\"userstory-upvote\", userStoryId)\n return $http.post(url)\n\n service.downvote = (userStoryId) ->\n url = $urls.resolve(\"userstory-downvote\", userStoryId)\n return $http.post(url)\n\n service.watch = (userStoryId) ->\n url = $urls.resolve(\"userstory-watch\", userStoryId)\n return $http.post(url)\n\n service.unwatch = (userStoryId) ->\n url = $urls.resolve(\"userstory-unwatch\", userStoryId)\n return $http.post(url)\n\n service.bulkUpdateBacklogOrder = (projectId, data) ->\n url = $urls.resolve(\"bulk-update-us-backlog-order\")\n params = {project_id: projectId, bulk_stories: data}\n return $http.post(url, params)\n\n service.bulkUpdateSprintOrder = (projectId, data) ->\n url = $urls.resolve(\"bulk-update-us-sprint-order\")\n params = {project_id: projectId, bulk_stories: data}\n return $http.post(url, params)\n\n service.bulkUpdateKanbanOrder = (projectId, data) ->\n url = $urls.resolve(\"bulk-update-us-kanban-order\")\n params = {project_id: projectId, bulk_stories: data}\n return $http.post(url, params)\n\n service.listValues = (projectId, type) ->\n params = {\"project\": projectId}\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(type, params)\n\n service.storeQueryParams = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getQueryParams = (projectId) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeShowTags = (projectId, showTags) ->\n hash = generateHash([projectId, 'showTags'])\n $storage.set(hash, showTags)\n\n service.getShowTags = (projectId) ->\n hash = generateHash([projectId, 'showTags'])\n return $storage.get(hash) or null\n\n return (instance) ->\n instance.userstories = service\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgUserstoriesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: webhooklogs.coffee\n###\n\nresourceProvider = ($repo, $urls, $http) ->\n service = {}\n\n service.list = (webhookId) ->\n params = {webhook: webhookId}\n return $repo.queryMany(\"webhooklogs\", params)\n\n service.resend = (webhooklogId) ->\n url = $urls.resolve(\"webhooklogs-resend\", webhooklogId)\n return $http.post(url)\n\n return (instance) ->\n instance.webhooklogs = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgWebhookLogsResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: webhooks.coffee\n###\n\nresourceProvider = ($repo, $urls, $http) ->\n service = {}\n\n service.list = (projectId) ->\n params = {project: projectId}\n return $repo.queryMany(\"webhooks\", params)\n\n service.test = (webhookId) ->\n url = $urls.resolve(\"webhooks-test\", webhookId)\n return $http.post(url)\n\n return (instance) ->\n instance.webhooks = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgWebhooksResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/wikis.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (wikiId) ->\n return $repo.queryOne(\"wiki\", wikiId)\n\n service.getBySlug = (projectId, slug) ->\n return $repo.queryOne(\"wiki\", \"by_slug?project=#{projectId}&slug=#{slug}\")\n\n service.listLinks = (projectId) ->\n return $repo.queryMany(\"wiki-links\", {project: projectId})\n\n return (instance) ->\n instance.wiki = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgWikiResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaUserSettings\")\n\n\n#############################################################################\n## User ChangePassword Controller\n#############################################################################\n\nclass UserChangePasswordController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"$tgAuth\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @auth, @translate) ->\n @scope.sectionName = @translate.instant(\"CHANGE_PASSWORD.SECTION_NAME\")\n @scope.user = @auth.getUser()\n\nmodule.controller(\"UserChangePasswordController\", UserChangePasswordController)\n\n\n#############################################################################\n## User ChangePassword Directive\n#############################################################################\n\nUserChangePasswordDirective = ($rs, $confirm, $loading, $translate) ->\n link = ($scope, $el, $attrs, ctrl) ->\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if $scope.newPassword1 != $scope.newPassword2\n $confirm.notify('error', $translate.instant(\"CHANGE_PASSWORD.ERROR_PASSWORD_MATCH\"))\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $rs.userSettings.changePassword($scope.currentPassword, $scope.newPassword1)\n promise.then =>\n currentLoading.finish()\n $confirm.notify('success')\n\n promise.then null, (response) =>\n currentLoading.finish()\n $confirm.notify('error', response.data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link:link\n }\n\nmodule.directive(\"tgUserChangePassword\", [\"$tgResources\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", UserChangePasswordDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues/lightboxes.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaUserSettings\")\n\n\n#############################################################################\n## Delete User Lightbox Directive\n#############################################################################\n\nDeleteUserDirective = ($repo, $rootscope, $auth, $location, $navUrls, lightboxService) ->\n link = ($scope, $el, $attrs) ->\n $scope.$on \"deletelightbox:new\", (ctx, user)->\n lightboxService.open($el)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n submit = ->\n promise = $repo.remove($scope.user)\n\n promise.then (data) ->\n lightboxService.close($el)\n $auth.logout()\n $location.path($navUrls.resolve(\"login\"))\n\n # FIXME: error handling?\n promise.then null, ->\n console.log \"FAIL\"\n\n $el.on \"click\", \".button-red\", (event) ->\n event.preventDefault()\n lightboxService.close($el)\n\n $el.on \"click\", \".button-green\", debounce 2000, (event) ->\n event.preventDefault()\n submit()\n\n return {\n link: link,\n templateUrl: \"user/lightbox/lightbox-delete-account.html\"\n }\n\nmodule.directive(\"tgLbDeleteUser\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\",\n \"lightboxService\", DeleteUserDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings/main.coffee\n###\n\ntaiga = @.taiga\nmixOf = @.taiga.mixOf\nsizeFormat = @.taiga.sizeFormat\nmodule = angular.module(\"taigaUserSettings\")\ndebounce = @.taiga.debounce\n\n#############################################################################\n## User settings Controller\n#############################################################################\n\nclass UserSettingsController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgConfig\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"$tgAuth\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @config, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @auth, @translate) ->\n @scope.sectionName = \"USER_SETTINGS.MENU.SECTION_TITLE\"\n\n @scope.project = {}\n @scope.user = @auth.getUser()\n\n if !@scope.user\n @location.path(@navUrls.resolve(\"permission-denied\"))\n @location.replace()\n\n @scope.lang = @getLan()\n @scope.theme = @getTheme()\n\n maxFileSize = @config.get(\"maxUploadFileSize\", null)\n if maxFileSize\n text = @translate.instant(\"USER_SETTINGS.AVATAR_MAX_SIZE\", {\"maxFileSize\": sizeFormat(maxFileSize)})\n @scope.maxFileSizeMsg = text\n\n promise = @.loadInitialData()\n\n promise.then null, @.onInitialDataError.bind(@)\n\n loadInitialData: ->\n @scope.availableThemes = @config.get(\"themes\", [])\n\n return @rs.locales.list().then (locales) =>\n @scope.locales = locales\n return locales\n\n openDeleteLightbox: ->\n @rootscope.$broadcast(\"deletelightbox:new\", @scope.user)\n\n getLan: ->\n return @scope.user.lang ||\n @translate.preferredLanguage()\n\n getTheme: ->\n return @scope.user.theme ||\n @config.get(\"defaultTheme\") ||\n \"taiga\"\n\nmodule.controller(\"UserSettingsController\", UserSettingsController)\n\n\n#############################################################################\n## User Profile Directive\n#############################################################################\n\nUserProfileDirective = ($confirm, $auth, $repo, $translate) ->\n link = ($scope, $el, $attrs) ->\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n return if not form.validate()\n\n changeEmail = $scope.user.isAttributeModified(\"email\")\n $scope.user.lang = $scope.lang\n $scope.user.theme = $scope.theme\n\n onSuccess = (data) =>\n $auth.setUser(data)\n\n if changeEmail\n text = $translate.instant(\"USER_PROFILE.CHANGE_EMAIL_SUCCESS\")\n $confirm.success(text)\n else\n $confirm.notify('success')\n\n onError = (data) =>\n form.setErrors(data)\n $confirm.notify('error', data._error_message)\n\n $repo.save($scope.user).then(onSuccess, onError)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgUserProfile\", [\"$tgConfirm\", \"$tgAuth\", \"$tgRepo\", \"$translate\", UserProfileDirective])\n\n\n#############################################################################\n## User Avatar Directive\n#############################################################################\n\nUserAvatarDirective = ($auth, $model, $rs, $confirm) ->\n link = ($scope, $el, $attrs) ->\n showSizeInfo = ->\n $el.find(\".size-info\").removeClass(\"hidden\")\n\n onSuccess = (response) ->\n user = $model.make_model(\"users\", response.data)\n $auth.setUser(user)\n $scope.user = user\n\n $el.find('.overlay').addClass('hidden')\n $confirm.notify('success')\n\n onError = (response) ->\n showSizeInfo() if response.status == 413\n $el.find('.overlay').addClass('hidden')\n $confirm.notify('error', response.data._error_message)\n\n # Change photo\n $el.on \"click\", \".js-change-avatar\", ->\n $el.find(\"#avatar-field\").click()\n\n $el.on \"change\", \"#avatar-field\", (event) ->\n if $scope.avatarAttachment\n $el.find('.overlay').removeClass('hidden')\n $rs.userSettings.changeAvatar($scope.avatarAttachment).then(onSuccess, onError)\n\n # Use gravatar photo\n $el.on \"click\", \"a.use-gravatar\", (event) ->\n $el.find('.overlay').removeClass('hidden')\n $rs.userSettings.removeAvatar().then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgUserAvatar\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", UserAvatarDirective])\n\n\n#############################################################################\n## User Avatar Model Directive\n#############################################################################\n\nTaigaAvatarModelDirective = ($parse) ->\n link = ($scope, $el, $attrs) ->\n model = $parse($attrs.tgAvatarModel)\n modelSetter = model.assign\n\n $el.bind 'change', ->\n $scope.$apply ->\n modelSetter($scope, $el[0].files[0])\n\n return {link:link}\n\nmodule.directive('tgAvatarModel', ['$parse', TaigaAvatarModelDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings/nav.coffee\n###\n\nUserSettingsNavigationDirective = ->\n link = ($scope, $el, $attrs) ->\n section = $attrs.tgUserSettingsNavigation\n $el.find(\".active\").removeClass(\"active\")\n $el.find(\"#usersettingsmenu-#{section} a\").addClass(\"active\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule = angular.module(\"taigaUserSettings\")\nmodule.directive(\"tgUserSettingsNavigation\", UserSettingsNavigationDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings/notifications.coffee\n###\n\ntaiga = @.taiga\nmixOf = @.taiga.mixOf\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaUserSettings\")\n\n\n#############################################################################\n## User settings Controller\n#############################################################################\n\nclass UserNotificationsController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"$tgAuth\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @auth) ->\n @scope.sectionName = \"USER_SETTINGS.NOTIFICATIONS.SECTION_NAME\"\n @scope.user = @auth.getUser()\n promise = @.loadInitialData()\n promise.then null, @.onInitialDataError.bind(@)\n\n loadInitialData: ->\n return @rs.notifyPolicies.list().then (notifyPolicies) =>\n @scope.notifyPolicies = notifyPolicies\n return notifyPolicies\n\nmodule.controller(\"UserNotificationsController\", UserNotificationsController)\n\n\n#############################################################################\n## User Notifications Directive\n#############################################################################\n\nUserNotificationsDirective = () ->\n link = ($scope, $el, $attrs) ->\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgUserNotifications\", UserNotificationsDirective)\n\n\n#############################################################################\n## User Notifications List Directive\n#############################################################################\n\nUserNotificationsListDirective = ($repo, $confirm, $compile) ->\n template = _.template(\"\"\"\n <% _.each(notifyPolicies, function (notifyPolicy, index) { %>\n
\">\n
<%- notifyPolicy.project_name %>
\n
\n
\n \" id=\"policy-all-<%- notifyPolicy.id %>\"\n value=\"2\" <% if (notifyPolicy.notify_level == 2) { %>checked=\"checked\"<% } %>/>\n \n
\n
\n
\n
\n \" id=\"policy-involved-<%- notifyPolicy.id %>\"\n value=\"1\" <% if (notifyPolicy.notify_level == 1) { %>checked=\"checked\"<% } %> />\n \n
\n
\n
\n
\n \" id=\"policy-none-<%- notifyPolicy.id %>\"\n value=\"3\" <% if (notifyPolicy.notify_level == 3) { %>checked=\"checked\"<% } %> />\n \n
\n
\n
\n <% }) %>\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n render = ->\n $el.off()\n\n ctx = {notifyPolicies: $scope.notifyPolicies}\n html = template(ctx)\n\n $el.html($compile(html)($scope))\n\n $el.on \"change\", \"input[type=radio]\", (event) ->\n target = angular.element(event.currentTarget)\n\n policyIndex = target.parents(\".policy-table-row\").data('index')\n policy = $scope.notifyPolicies[policyIndex]\n prev_level = policy.notify_level\n policy.notify_level = parseInt(target.val(), 10)\n\n onSuccess = ->\n $confirm.notify(\"success\")\n\n onError = ->\n $confirm.notify(\"error\")\n target.parents(\".policy-table-row\")\n .find(\"input[value=#{prev_level}]\")\n .prop(\"checked\", true)\n\n $repo.save(policy).then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n bindOnce($scope, $attrs.ngModel, render)\n\n return {link:link}\n\nmodule.directive(\"tgUserNotificationsList\", [\"$tgRepo\", \"$tgConfirm\", \"$compile\",\n UserNotificationsListDirective])\n","###\n# Copyright (C) 2015 Taiga Agile LLC\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: components.module.coffee\n###\n\nangular.module(\"taigaComponents\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: external-apps.module.coffee\n###\n\nmodule = angular.module(\"taigaExternalApps\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: home.module.coffee\n###\n\nmodule = angular.module(\"taigaHome\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: navigation-bar.module.coffee\n###\n\nangular.module(\"taigaNavigationBar\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile.module.coffee\n###\n\nmodule = angular.module(\"taigaProfile\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: projects.module.coffee\n###\n\nangular.module(\"taigaProjects\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: resources.module.coffee\n###\n\nangular.module(\"taigaResources2\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline.module.coffee\n###\n\nangular.module(\"taigaUserTimeline\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: joy-ride.directive.coffee\n###\n\ntaiga = @.taiga\n\nJoyRideDirective = ($rootScope, currentUserService, joyRideService, $location) ->\n link = (scope, el, attrs, ctrl) ->\n unsuscribe = null\n intro = introJs()\n\n #Todo: translate\n intro.setOptions({\n exitOnEsc: false,\n exitOnOverlayClick: false,\n showStepNumbers: false,\n nextLabel: 'Next →',\n prevLabel: '← Back',\n skipLabel: 'Skip',\n doneLabel: 'Done',\n disableInteraction: true\n })\n\n intro.oncomplete () ->\n $('html,body').scrollTop(0)\n\n intro.onexit () ->\n currentUserService.disableJoyRide()\n\n initJoyrRide = (next, config) ->\n if !config[next.joyride]\n return\n\n intro.setOption('steps', joyRideService.get(next.joyride))\n intro.start()\n\n $rootScope.$on '$routeChangeSuccess', (event, next) ->\n if !next.joyride || !currentUserService.isAuthenticated()\n intro.exit()\n unsuscribe() if unsuscribe\n return\n\n\n intro.oncomplete () ->\n currentUserService.disableJoyRide(next.joyride)\n\n if next.loader\n unsuscribe = $rootScope.$on 'loader:end', () ->\n currentUserService.loadJoyRideConfig()\n .then (config) -> initJoyrRide(next, config)\n\n unsuscribe()\n else\n currentUserService.loadJoyRideConfig()\n .then (config) -> initJoyrRide(next, config)\n\n return {\n scope: {},\n link: link\n }\n\nJoyRideDirective.$inject = [\n \"$rootScope\",\n \"tgCurrentUserService\",\n \"tgJoyRideService\",\n \"$location\"\n]\n\nangular.module(\"taigaComponents\").directive(\"tgJoyRide\", JoyRideDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: joy-ride.service.coffee\n###\n\nclass JoyRideService extends taiga.Service\n @.$inject = [\n '$translate',\n 'tgCheckPermissionsService'\n ]\n\n constructor: (@translate, @checkPermissionsService) ->\n\n getConfig: () ->\n return {\n dashboard: () =>\n steps = [\n {\n element: '.project-list > section:not(.ng-hide)',\n position: 'left',\n joyride: {\n title: @translate.instant('JOYRIDE.DASHBOARD.STEP1.TITLE'),\n text: @translate.instant('JOYRIDE.DASHBOARD.STEP1.TEXT')\n }\n },\n {\n element: '.working-on-container',\n position: 'right',\n joyride: {\n title: @translate.instant('JOYRIDE.DASHBOARD.STEP2.TITLE'),\n text: @translate.instant('JOYRIDE.DASHBOARD.STEP2.TEXT')\n }\n },\n {\n element: '.watching-container',\n position: 'right',\n joyride: {\n title: @translate.instant('JOYRIDE.DASHBOARD.STEP3.TITLE')\n text: [\n @translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT1'),\n @translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT2')\n ]\n }\n }\n ]\n\n if !$('.project-list .create-project-button').is(':hidden')\n steps.push({\n element: '.project-list .create-project-button',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.DASHBOARD.STEP4.TITLE')\n text: [\n @translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT1'),\n @translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT2')\n ]\n }\n })\n\n return steps\n\n backlog: () =>\n steps = [\n {\n element: '.summary',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.BACKLOG.STEP1.TITLE')\n text: [\n @translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT1'),\n @translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT2')\n ]\n }\n },\n {\n element: '.backlog-table-empty',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.BACKLOG.STEP2.TITLE')\n text: @translate.instant('JOYRIDE.BACKLOG.STEP2.TEXT')\n }\n },\n {\n element: '.sprints',\n position: 'left',\n joyride: {\n title: @translate.instant('JOYRIDE.BACKLOG.STEP3.TITLE')\n text: @translate.instant('JOYRIDE.BACKLOG.STEP3.TEXT')\n }\n }\n ]\n\n if @checkPermissionsService.check('add_us')\n steps.push({\n element: '.new-us',\n position: 'rigth',\n joyride: {\n title: @translate.instant('JOYRIDE.BACKLOG.STEP4.TITLE')\n text: @translate.instant('JOYRIDE.BACKLOG.STEP4.TEXT')\n }\n })\n\n return steps\n\n kanban: () =>\n steps = [\n {\n element: '.kanban-table-inner',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.KANBAN.STEP1.TITLE')\n text: @translate.instant('JOYRIDE.KANBAN.STEP1.TEXT')\n }\n },\n {\n element: '.card-placeholder',\n position: 'right',\n joyride: {\n title: @translate.instant('JOYRIDE.KANBAN.STEP2.TITLE')\n text: @translate.instant('JOYRIDE.KANBAN.STEP2.TEXT')\n }\n }\n ]\n\n if @checkPermissionsService.check('add_us')\n steps.push({\n element: '.icon-plus',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.KANBAN.STEP3.TITLE')\n text: [\n @translate.instant('JOYRIDE.KANBAN.STEP3.TEXT1'),\n @translate.instant('JOYRIDE.KANBAN.STEP3.TEXT2'),\n ]\n }\n })\n\n return steps\n }\n\n get: (name) ->\n joyRides = @.getConfig()\n joyRide = joyRides[name].call(this)\n\n return _.map joyRide, (item) ->\n html = \"\"\n\n if item.joyride.title\n html += \"

#{item.joyride.title}

\"\n\n if _.isArray(item.joyride.text)\n _.forEach item.joyride.text, (text) ->\n html += \"

#{text}

\"\n else\n html += \"

#{item.joyride.text}

\"\n\n item.intro = html\n\n return item\n\nangular.module(\"taigaComponents\").service(\"tgJoyRideService\", JoyRideService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: project-menu.controller.coffee\n###\n\nclass ProjectMenuController\n @.$inject = [\n \"tgProjectService\",\n \"tgLightboxFactory\"\n ]\n\n constructor: (@projectService, @lightboxFactory) ->\n @.project = null\n @.menu = Immutable.Map()\n\n show: () ->\n @.project = @projectService.project\n\n @.active = @._getActiveSection()\n\n @._setVideoConference()\n @._setMenuPermissions()\n\n hide: () ->\n @.project = null\n @.menu = {}\n\n search: () ->\n @lightboxFactory.create(\"tg-search-box\", {\n \"class\": \"lightbox lightbox-search\"\n })\n\n _setVideoConference: () ->\n videoconferenceUrl = @._videoConferenceUrl()\n\n if videoconferenceUrl\n @.project = @.project.set(\"videoconferenceUrl\", videoconferenceUrl)\n\n _setMenuPermissions: () ->\n @.menu = Immutable.Map({\n backlog: false,\n kanban: false,\n issues: false,\n wiki: false\n })\n\n if @.project.get(\"is_backlog_activated\") && @.project.get(\"my_permissions\").indexOf(\"view_us\") != -1\n @.menu = @.menu.set(\"backlog\", true)\n\n if @.project.get(\"is_kanban_activated\") && @.project.get(\"my_permissions\").indexOf(\"view_us\") != -1\n @.menu = @.menu.set(\"kanban\", true)\n\n if @.project.get(\"is_issues_activated\") && @.project.get(\"my_permissions\").indexOf(\"view_issues\") != -1\n @.menu = @.menu.set(\"issues\", true)\n\n if @.project.get(\"is_wiki_activated\") && @.project.get(\"my_permissions\").indexOf(\"view_wiki_pages\") != -1\n @.menu = @.menu.set(\"wiki\", true)\n\n _getActiveSection: () ->\n sectionName = @projectService.section\n sectionsBreadcrumb = @projectService.sectionsBreadcrumb\n\n indexBacklog = sectionsBreadcrumb.lastIndexOf(\"backlog\")\n indexKanban = sectionsBreadcrumb.lastIndexOf(\"kanban\")\n\n if indexBacklog != -1 || indexKanban != -1\n if indexKanban == -1 || indexBacklog < indexKanban\n oldSectionName = \"backlog\"\n else\n oldSectionName = \"kanban\"\n\n if sectionName == \"backlog-kanban\"\n if oldSectionName in [\"backlog\", \"kanban\"]\n sectionName = oldSectionName\n else if @.project.get(\"is_backlog_activated\") && !@.project.get(\"is_kanban_activated\")\n sectionName = \"backlog\"\n else if !@.project.get(\"is_backlog_activated\") && @.project.get(\"is_kanban_activated\")\n sectionName = \"kanban\"\n\n return sectionName\n\n _videoConferenceUrl: () ->\n if @.project.get(\"videoconferences\") == \"appear-in\"\n baseUrl = \"https://appear.in/\"\n else if @.project.get(\"videoconferences\") == \"talky\"\n baseUrl = \"https://talky.io/\"\n else if @.project.get(\"videoconferences\") == \"jitsi\"\n baseUrl = \"https://meet.jit.si/\"\n url = @.project.get(\"slug\") + \"-\" + taiga.slugify(@.project.get(\"videoconferences_extra_data\"))\n url = url.replace(/-/g, \"\")\n return baseUrl + url\n else if @.project.get(\"videoconferences\") == \"custom\"\n return @.project.get(\"videoconferences_extra_data\")\n else\n return \"\"\n\n if @.project.get(\"videoconferences_extra_data\")\n url = @.project.get(\"slug\") + \"-\" + @.project.get(\"videoconferences_extra_data\")\n else\n url = @.project.get(\"slug\")\n\n return baseUrl + url\n\nangular.module(\"taigaComponents\").controller(\"ProjectMenu\", ProjectMenuController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: project-menu.directive.coffee\n###\n\ntaiga = @.taiga\n\nProjectMenuDirective = (projectService, lightboxFactory) ->\n link = (scope, el, attrs, ctrl) ->\n projectChange = () ->\n if projectService.project\n ctrl.show()\n else\n ctrl.hide()\n\n scope.$watch ( () ->\n return projectService.project\n ), projectChange\n\n return {\n scope: {},\n controller: \"ProjectMenu\",\n controllerAs: \"vm\",\n templateUrl: \"components/project-menu/project-menu.html\",\n link: link\n }\n\nProjectMenuDirective.$inject = [\n \"tgProjectService\",\n \"tgLightboxFactory\"\n]\n\nangular.module(\"taigaComponents\").directive(\"tgProjectMenu\", ProjectMenuDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.directive.coffee\n###\n\n\nTermsOfServiceAndPrivacyPolicyNoticeDirective = ($config) ->\n link = (scope, el, attrs) ->\n scope.privacyPolicyUrl = $config.get(\"privacyPolicyUrl\")\n scope.termsOfServiceUrl = $config.get(\"termsOfServiceUrl\")\n\n return {\n restrict: \"AE\",\n scope: {},\n link: link,\n templateUrl: \"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html\"\n }\n\nangular.module(\"taigaComponents\")\n .directive(\"tgTermsOfServiceAndPrivacyPolicyNotice\", [\n \"$tgConfig\",\n TermsOfServiceAndPrivacyPolicyNoticeDirective\n ])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: vote-button.controller.coffee\n###\n\nclass VoteButtonController\n @.$inject = [\n \"tgCurrentUserService\",\n ]\n\n constructor: (@currentUserService) ->\n @.user = @currentUserService.getUser()\n @.isMouseOver = false\n @.loading = false\n\n showTextWhenMouseIsOver: ->\n @.isMouseOver = true\n\n showTextWhenMouseIsLeave: ->\n @.isMouseOver = false\n\n toggleVote: ->\n @.loading = true\n\n if not @.item.is_voter\n promise = @._upvote()\n else\n promise = @._downvote()\n\n promise.finally () => @.loading = false\n\n return promise\n\n _upvote: ->\n @.onUpvote().then =>\n @.showTextWhenMouseIsLeave()\n\n _downvote: ->\n @.onDownvote()\n\nangular.module(\"taigaComponents\").controller(\"VoteButton\", VoteButtonController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: vote-button.directive.coffee\n###\n\nVoteButtonDirective = ->\n return {\n scope: {}\n controller: \"VoteButton\",\n bindToController: {\n item: \"=\",\n onUpvote: \"=\",\n onDownvote: \"=\"\n }\n controllerAs: \"vm\",\n templateUrl: \"components/vote-button/vote-button.html\",\n }\n\nangular.module(\"taigaComponents\").directive(\"tgVoteButton\", VoteButtonDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-button.controller.coffee\n###\n\nclass WatchButtonController\n @.$inject = [\n \"tgCurrentUserService\",\n ]\n\n constructor: (@currentUserService) ->\n @.user = @currentUserService.getUser()\n @.isMouseOver = false\n @.loading = false\n\n showTextWhenMouseIsOver: ->\n @.isMouseOver = true\n\n showTextWhenMouseIsLeave: ->\n @.isMouseOver = false\n\n toggleWatch: ->\n @.loading = true\n\n if not @.item.is_watcher\n promise = @._watch()\n else\n promise = @._unwatch()\n\n promise.finally () => @.loading = false\n\n return promise\n\n _watch: ->\n @.onWatch().then =>\n @.showTextWhenMouseIsLeave()\n\n _unwatch: ->\n @.onUnwatch()\n\nangular.module(\"taigaComponents\").controller(\"WatchButton\", WatchButtonController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-button.directive.coffee\n###\n\nWatchButtonDirective = ->\n return {\n scope: {}\n controller: \"WatchButton\",\n bindToController: {\n item: \"=\",\n onWatch: \"=\",\n onUnwatch: \"=\"\n }\n controllerAs: \"vm\",\n templateUrl: \"components/watch-button/watch-button.html\",\n }\n\nangular.module(\"taigaComponents\").directive(\"tgWatchButton\", WatchButtonDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: external-app.controller.coffee\n###\n\ntaiga = @.taiga\n\nclass ExternalAppController extends taiga.Controller\n @.$inject = [\n \"$routeParams\",\n \"tgExternalAppsService\",\n \"$window\",\n \"tgCurrentUserService\",\n \"$location\",\n \"$tgNavUrls\",\n \"tgXhrErrorService\",\n \"tgLoader\"\n ]\n\n constructor: (@routeParams, @externalAppsService, @window, @currentUserService, @location,\n @navUrls, @xhrError, @loader) ->\n @loader.start(false)\n @._applicationId = @routeParams.application\n @._state = @routeParams.state\n @._getApplicationToken()\n @._user = @currentUserService.getUser()\n @._application = null\n nextUrl = encodeURIComponent(@location.url())\n loginUrl = @navUrls.resolve(\"login\")\n @.loginWithAnotherUserUrl = \"#{loginUrl}?next=#{nextUrl}\"\n\n taiga.defineImmutableProperty @, \"user\", () => @._user\n taiga.defineImmutableProperty @, \"application\", () => @._application\n\n _redirect: (applicationToken) =>\n nextUrl = applicationToken.get(\"next_url\")\n @window.open(nextUrl, \"_self\")\n\n _getApplicationToken: =>\n return @externalAppsService.getApplicationToken(@._applicationId, @._state)\n .then (data) =>\n @._application = data.get(\"application\")\n if data.get(\"auth_code\")\n @._redirect(data)\n else\n @loader.pageLoaded()\n\n .catch (xhr) =>\n @loader.pageLoaded()\n return @xhrError.response(xhr)\n\n cancel: () ->\n @window.history.back()\n\n createApplicationToken: =>\n return @externalAppsService.authorizeApplicationToken(@._applicationId, @._state)\n .then (data) =>\n @._redirect(data)\n .catch (xhr) =>\n return @xhrError.response(xhr)\n\n\nangular.module(\"taigaExternalApps\").controller(\"ExternalApp\", ExternalAppController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: external-app.service.coffee\n###\n\nclass ExternalAppsService extends taiga.Service\n @.$inject = [\n \"tgResources\"\n ]\n\n constructor: (@rs) ->\n\n getApplicationToken: (applicationId, state) ->\n return @rs.externalapps.getApplicationToken(applicationId, state)\n\n authorizeApplicationToken: (applicationId, state) ->\n return @rs.externalapps.authorizeApplicationToken(applicationId, state)\n\nangular.module(\"taigaExternalApps\").service(\"tgExternalAppsService\", ExternalAppsService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: feedback.service.coffee\n###\n\nclass FeedbackService extends taiga.Service\n @.$inject = [\"tgLightboxFactory\"]\n\n constructor: (@lightboxFactory) ->\n\n sendFeedback: ->\n @lightboxFactory.create(\"tg-lb-feedback\", {\n \"class\": \"lightbox lightbox-feedback lightbox-generic-form\"\n })\n\nangular.module(\"taigaFeedback\").service(\"tgFeedbackService\", FeedbackService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: duty.directive.coffee\n###\n\nDutyDirective = (navurls, $translate) ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n scope.vm.duty = scope.duty\n\n scope.vm.getDutyType = () ->\n if scope.vm.duty\n if scope.vm.duty.get('_name') == \"userstories\"\n return $translate.instant(\"COMMON.USER_STORY\")\n if scope.vm.duty.get('_name') == \"tasks\"\n return $translate.instant(\"COMMON.TASK\")\n if scope.vm.duty.get('_name') == \"issues\"\n return $translate.instant(\"COMMON.ISSUE\")\n\n return {\n templateUrl: \"home/duties/duty.html\"\n scope: {\n \"duty\": \"=tgDuty\"\n }\n link: link\n }\n\nDutyDirective.$inject = [\n \"$tgNavUrls\",\n \"$translate\"\n]\n\nangular.module(\"taigaHome\").directive(\"tgDuty\", DutyDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: home.service.coffee\n###\n\ngroupBy = @.taiga.groupBy\n\nclass HomeService extends taiga.Service\n @.$inject = [\n \"$tgNavUrls\",\n \"tgResources\",\n \"tgProjectsService\"\n ]\n\n constructor: (@navurls, @rs, @projectsService) ->\n\n _attachProjectInfoToWorkInProgress: (workInProgress, projectsById) ->\n _attachProjectInfoToDuty = (duty, objType) =>\n project = projectsById.get(String(duty.get('project')))\n\n ctx = {\n project: project.get('slug')\n ref: duty.get('ref')\n }\n\n url = @navurls.resolve(\"project-#{objType}-detail\", ctx)\n\n duty = duty.set('url', url)\n duty = duty.set('projectName', project.get('name'))\n duty = duty.set(\"_name\", objType)\n\n return duty\n\n assignedTo = workInProgress.get(\"assignedTo\")\n\n if assignedTo.get(\"userStories\")\n _duties = assignedTo.get(\"userStories\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"userstories\")\n\n assignedTo = assignedTo.set(\"userStories\", _duties)\n\n if assignedTo.get(\"tasks\")\n _duties = assignedTo.get(\"tasks\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"tasks\")\n\n assignedTo = assignedTo.set(\"tasks\", _duties)\n\n if assignedTo.get(\"issues\")\n _duties = assignedTo.get(\"issues\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"issues\")\n\n assignedTo = assignedTo.set(\"issues\", _duties)\n\n watching = workInProgress.get(\"watching\")\n\n if watching.get(\"userStories\")\n _duties = watching.get(\"userStories\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"userstories\")\n\n watching = watching.set(\"userStories\", _duties)\n\n if watching.get(\"tasks\")\n _duties = watching.get(\"tasks\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"tasks\")\n\n watching = watching.set(\"tasks\", _duties)\n\n if watching.get(\"issues\")\n _duties = watching.get(\"issues\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"issues\")\n\n watching = watching.set(\"issues\", _duties)\n\n\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo)\n workInProgress = workInProgress.set(\"watching\", watching)\n\n\n getWorkInProgress: (userId) ->\n projectsById = Immutable.Map()\n\n projectsPromise = @projectsService.getProjectsByUserId(userId).then (projects) ->\n projectsById = Immutable.fromJS(groupBy(projects.toJS(), (p) -> p.id))\n\n assignedTo = Immutable.Map()\n\n params = {\n status__is_closed: false\n assigned_to: userId\n }\n\n params_us = {\n is_closed: false\n assigned_to: userId\n }\n\n assignedUserStoriesPromise = @rs.userstories.listInAllProjects(params_us).then (userstories) ->\n assignedTo = assignedTo.set(\"userStories\", userstories)\n\n assignedTasksPromise = @rs.tasks.listInAllProjects(params).then (tasks) ->\n assignedTo = assignedTo.set(\"tasks\", tasks)\n\n assignedIssuesPromise = @rs.issues.listInAllProjects(params).then (issues) ->\n assignedTo = assignedTo.set(\"issues\", issues)\n\n params = {\n status__is_closed: false\n watchers: userId\n }\n\n params_us = {\n is_closed: false\n watchers: userId\n }\n\n watching = Immutable.Map()\n\n watchingUserStoriesPromise = @rs.userstories.listInAllProjects(params_us).then (userstories) ->\n watching = watching.set(\"userStories\", userstories)\n\n watchingTasksPromise = @rs.tasks.listInAllProjects(params).then (tasks) ->\n watching = watching.set(\"tasks\", tasks)\n\n watchingIssuesPromise = @rs.issues.listInAllProjects(params).then (issues) ->\n watching = watching.set(\"issues\", issues)\n\n workInProgress = Immutable.Map()\n\n Promise.all([\n projectsPromise\n assignedUserStoriesPromise,\n assignedTasksPromise,\n assignedIssuesPromise,\n watchingUserStoriesPromise,\n watchingTasksPromise,\n watchingIssuesPromise\n ]).then =>\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo)\n workInProgress = workInProgress.set(\"watching\", watching)\n\n workInProgress = @._attachProjectInfoToWorkInProgress(workInProgress, projectsById)\n\n return workInProgress\n\nangular.module(\"taigaHome\").service(\"tgHomeService\", HomeService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: home-project-list.directive.coffee\n###\n\nHomeProjectListDirective = (currentUserService, projectsService) ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n\n taiga.defineImmutableProperty(scope.vm, \"projects\", () -> currentUserService.projects.get(\"recents\"))\n\n scope.vm.newProject = ->\n projectsService.newProject()\n\n directive = {\n templateUrl: \"home/projects/home-project-list.html\"\n scope: {}\n link: link\n }\n\n return directive\n\nHomeProjectListDirective.$inject = [\n \"tgCurrentUserService\",\n \"tgProjectsService\"\n]\n\nangular.module(\"taigaHome\").directive(\"tgHomeProjectList\", HomeProjectListDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: working-on.controller.coffee\n###\n\nclass WorkingOnController\n @.$inject = [\n \"tgHomeService\"\n ]\n\n constructor: (@homeService) ->\n @.assignedTo = Immutable.Map()\n @.watching = Immutable.Map()\n\n _setAssignedTo: (workInProgress) ->\n userStories = workInProgress.get(\"assignedTo\").get(\"userStories\")\n tasks = workInProgress.get(\"assignedTo\").get(\"tasks\")\n issues = workInProgress.get(\"assignedTo\").get(\"issues\")\n\n @.assignedTo = userStories.concat(tasks).concat(issues)\n if @.assignedTo.size > 0\n @.assignedTo = @.assignedTo.sortBy((elem) -> elem.get(\"modified_date\")).reverse()\n\n _setWatching: (workInProgress) ->\n userStories = workInProgress.get(\"watching\").get(\"userStories\")\n tasks = workInProgress.get(\"watching\").get(\"tasks\")\n issues = workInProgress.get(\"watching\").get(\"issues\")\n\n @.watching = userStories.concat(tasks).concat(issues)\n if @.watching.size > 0\n @.watching = @.watching.sortBy((elem) -> elem.get(\"modified_date\")).reverse()\n\n getWorkInProgress: (userId) ->\n return @homeService.getWorkInProgress(userId).then (workInProgress) =>\n @._setAssignedTo(workInProgress)\n @._setWatching(workInProgress)\n\nangular.module(\"taigaHome\").controller(\"WorkingOn\", WorkingOnController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: working-on.directive.coffee\n###\n\nWorkingOnDirective = (homeService, currentUserService) ->\n link = (scope, el, attrs, ctrl) ->\n user = currentUserService.getUser()\n # If we are not logged in the user will be null\n if user\n userId = user.get(\"id\")\n ctrl.getWorkInProgress(userId)\n\n return {\n controller: \"WorkingOn\",\n controllerAs: \"vm\",\n templateUrl: \"home/working-on/working-on.html\",\n scope: {},\n link: link\n }\n\nWorkingOnDirective.$inject = [\n \"tgHomeService\",\n \"tgCurrentUserService\"\n]\n\nangular.module(\"taigaHome\").directive(\"tgWorkingOn\", WorkingOnDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: dropdown-project-list.directive.coffee\n###\n\nDropdownProjectListDirective = (currentUserService, projectsService) ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n\n taiga.defineImmutableProperty(scope.vm, \"projects\", () -> currentUserService.projects.get(\"recents\"))\n\n scope.vm.newProject = ->\n projectsService.newProject()\n\n directive = {\n templateUrl: \"navigation-bar/dropdown-project-list/dropdown-project-list.html\"\n scope: {}\n link: link\n }\n\n return directive\n\nDropdownProjectListDirective.$inject = [\n \"tgCurrentUserService\",\n \"tgProjectsService\"\n]\n\nangular.module(\"taigaNavigationBar\").directive(\"tgDropdownProjectList\", DropdownProjectListDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: dropdown-user.directive.coffee\n###\n\nDropdownUserDirective = (authService, configService, locationService,\n navUrlsService, feedbackService) ->\n\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n scope.vm.isFeedbackEnabled = configService.get(\"feedbackEnabled\")\n taiga.defineImmutableProperty(scope.vm, \"user\", () -> authService.userData)\n\n scope.vm.logout = ->\n authService.logout()\n locationService.path(navUrlsService.resolve(\"login\"))\n\n scope.vm.sendFeedback = ->\n feedbackService.sendFeedback()\n\n directive = {\n templateUrl: \"navigation-bar/dropdown-user/dropdown-user.html\"\n scope: {}\n link: link\n }\n\n return directive\n\nDropdownUserDirective.$inject = [\n \"$tgAuth\",\n \"$tgConfig\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgFeedbackService\"\n]\n\nangular.module(\"taigaNavigationBar\").directive(\"tgDropdownUser\", DropdownUserDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: navigation-bar.directive.coffee\n###\n\nNavigationBarDirective = (currentUserService, navigationBarService, $location) ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n\n scope.$on \"$routeChangeSuccess\", () ->\n if $location.path() == \"/\"\n scope.vm.active = true\n else\n scope.vm.active = false\n\n taiga.defineImmutableProperty(scope.vm, \"projects\", () -> currentUserService.projects.get(\"recents\"))\n taiga.defineImmutableProperty(scope.vm, \"isAuthenticated\", () -> currentUserService.isAuthenticated())\n taiga.defineImmutableProperty(scope.vm, \"isEnabledHeader\", () -> navigationBarService.isEnabledHeader())\n\n\n directive = {\n templateUrl: \"navigation-bar/navigation-bar.html\"\n scope: {}\n link: link\n }\n\n return directive\n\nNavigationBarDirective.$inject = [\n \"tgCurrentUserService\",\n \"tgNavigationBarService\"\n \"$location\"\n]\n\nangular.module(\"taigaNavigationBar\").directive(\"tgNavigationBar\", NavigationBarDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: navigation-bar.service.coffee\n###\n\nclass NavigationBarService extends taiga.Service\n\n constructor: ->\n @.disableHeader()\n\n enableHeader: ->\n @.enabledHeader = true\n\n disableHeader: ->\n @.enabledHeader = false\n\n isEnabledHeader: ->\n return @.enabledHeader\n\nangular.module(\"taigaNavigationBar\").service(\"tgNavigationBarService\", NavigationBarService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-bar.controller.coffee\n###\n\nclass ProfileBarController\n @.$inject = [\n \"tgUserService\"\n ]\n\n constructor: (@userService) ->\n @.loadStats()\n\n loadStats: () ->\n return @userService.getStats(@.user.get(\"id\")).then (stats) =>\n @.stats = stats\n\nangular.module(\"taigaProfile\").controller(\"ProfileBar\", ProfileBarController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-bar.directive.coffee\n###\n\nProfileBarDirective = () ->\n return {\n templateUrl: \"profile/profile-bar/profile-bar.html\",\n controller: \"ProfileBar\",\n controllerAs: \"vm\",\n scope: {\n user: \"=user\",\n isCurrentUser: \"=iscurrentuser\"\n },\n bindToController: true\n }\n\n\nangular.module(\"taigaProfile\").directive(\"tgProfileBar\", ProfileBarDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-contacts.controller.coffee\n###\n\nclass ProfileContactsController\n @.$inject = [\n \"tgUserService\",\n \"tgCurrentUserService\"\n ]\n\n constructor: (@userService, @currentUserService) ->\n @.currentUser = @currentUserService.getUser()\n\n @.isCurrentUser = false\n\n if @.currentUser && @.currentUser.get(\"id\") == @.user.get(\"id\")\n @.isCurrentUser = true\n\n loadContacts: () ->\n @userService.getContacts(@.user.get(\"id\"))\n .then (contacts) =>\n @.contacts = contacts\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileContacts\", ProfileContactsController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-contacts.directive.coffee\n###\n\nProfileContactsDirective = () ->\n link = (scope, elm, attrs, ctrl) ->\n ctrl.loadContacts()\n\n return {\n templateUrl: \"profile/profile-contacts/profile-contacts.html\",\n scope: {\n user: \"=\"\n },\n controllerAs: \"vm\",\n controller: \"ProfileContacts\",\n link: link,\n bindToController: true\n }\n\nangular.module(\"taigaProfile\").directive(\"tgProfileContacts\", ProfileContactsDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: items.directive.coffee\n###\n\nFavItemDirective = ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {item: scope.item}\n\n templateUrl = (el, attrs) ->\n if attrs.itemType == \"project\"\n return \"profile/profile-favs/items/project.html\"\n else # if attr.itemType in [\"userstory\", \"task\", \"issue\"]\n return \"profile/profile-favs/items/ticket.html\"\n\n return {\n scope: {\n \"item\": \"=tgFavItem\"\n }\n link: link\n templateUrl: templateUrl\n }\n\n\nangular.module(\"taigaProfile\").directive(\"tgFavItem\", FavItemDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-favs.controller.coffee\n###\n\ndebounceLeading = @.taiga.debounceLeading\n\nclass FavsBaseController\n constructor: ->\n @._init()\n\n #@._getItems = null # Define in inheritance classes\n #\n _init: ->\n @.enableFilterByAll = true\n @.enableFilterByProjects = true\n @.enableFilterByUserStories = true\n @.enableFilterByTasks = true\n @.enableFilterByIssues = true\n @.enableFilterByTextQuery = true\n\n @._resetList()\n @.q = null\n @.type = null\n\n _resetList: ->\n @.items = Immutable.List()\n @.scrollDisabled = false\n @._page = 1\n\n _enableLoadingSpinner: ->\n @.isLoading = true\n\n _disableLoadingSpinner: ->\n @.isLoading = false\n\n _enableScroll : ->\n @.scrollDisabled = false\n\n _disableScroll : ->\n @.scrollDisabled = true\n\n _checkIfHasMorePages: (hasNext) ->\n if hasNext\n @._page += 1\n @._enableScroll()\n else\n @._disableScroll()\n\n _checkIfHasNoResults: ->\n @.hasNoResults = @.items.size == 0\n\n loadItems: ->\n @._enableLoadingSpinner()\n @._disableScroll()\n\n @._getItems(@.user.get(\"id\"), @._page, @.type, @.q)\n .then (response) =>\n @.items = @.items.concat(response.get(\"data\"))\n\n @._checkIfHasMorePages(response.get(\"next\"))\n @._checkIfHasNoResults()\n @._disableLoadingSpinner()\n\n return @.items\n .catch =>\n @._disableLoadingSpinner()\n\n return @.items\n\n ################################################\n ## Filtre actions\n ################################################\n filterByTextQuery: debounceLeading 500, ->\n @._resetList()\n @.loadItems()\n\n showAll: ->\n if @.type isnt null\n @.type = null\n @._resetList()\n @.loadItems()\n\n showProjectsOnly: ->\n if @.type isnt \"project\"\n @.type = \"project\"\n @._resetList()\n @.loadItems()\n\n showUserStoriesOnly: ->\n if @.type isnt \"userstory\"\n @.type = \"userstory\"\n @._resetList()\n @.loadItems()\n\n showTasksOnly: ->\n if @.type isnt \"task\"\n @.type = \"task\"\n @._resetList()\n @.loadItems()\n\n showIssuesOnly: ->\n if @.type isnt \"issue\"\n @.type = \"issue\"\n @._resetList()\n @.loadItems()\n\n\n####################################################\n## Liked\n####################################################\n\nclass ProfileLikedController extends FavsBaseController\n @.$inject = [\n \"tgUserService\",\n ]\n\n constructor: (@userService) ->\n super()\n @.enableFilterByAll = false\n @.enableFilterByProjects = false\n @.enableFilterByUserStories = false\n @.enableFilterByTasks = false\n @.enableFilterByIssues = false\n @.enableFilterByTextQuery = true\n @._getItems = @userService.getLiked\n\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileLiked\", ProfileLikedController)\n\n####################################################\n## Voted\n####################################################\n\nclass ProfileVotedController extends FavsBaseController\n @.$inject = [\n \"tgUserService\",\n ]\n\n constructor: (@userService) ->\n super()\n @.enableFilterByAll = true\n @.enableFilterByProjects = false\n @.enableFilterByUserStories = true\n @.enableFilterByTasks = true\n @.enableFilterByIssues = true\n @.enableFilterByTextQuery = true\n @._getItems = @userService.getVoted\n\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileVoted\", ProfileVotedController)\n\n\n\n####################################################\n## Watched\n####################################################\n\nclass ProfileWatchedController extends FavsBaseController\n @.$inject = [\n \"tgUserService\",\n ]\n\n constructor: (@userService) ->\n super()\n @._getItems = @userService.getWatched\n\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileWatched\", ProfileWatchedController)\n\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-favs.directive.coffee\n###\n\nbase = {\n scope: {},\n bindToController: {\n user: \"=\"\n type: \"@\"\n q: \"@\"\n scrollDisabled: \"@\"\n isLoading: \"@\"\n hasNoResults: \"@\"\n }\n controller: null, # Define in directives\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-favs/profile-favs.html\",\n}\n\n\n####################################################\n## Liked\n####################################################\n\nProfileLikedDirective = () ->\n return _.extend({}, base, {\n controller: \"ProfileLiked\"\n })\n\nangular.module(\"taigaProfile\").directive(\"tgProfileLiked\", ProfileLikedDirective)\n\n\n####################################################\n## Voted\n####################################################\n\nProfileVotedDirective = () ->\n return _.extend({}, base, {\n controller: \"ProfileVoted\"\n })\n\nangular.module(\"taigaProfile\").directive(\"tgProfileVoted\", ProfileVotedDirective)\n\n\n####################################################\n## Watched\n####################################################\n\nProfileWatchedDirective = () ->\n return _.extend({}, base, {\n controller: \"ProfileWatched\"\n })\n\nangular.module(\"taigaProfile\").directive(\"tgProfileWatched\", ProfileWatchedDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-hints.controller.coffee\n###\n\nclass ProfileHints\n HINTS: [\n { #hint1\n url: \"https://taiga.io/support/import-export-projects/\"\n },\n { #hint2\n url: \"https://taiga.io/support/custom-fields/\"\n },\n { #hint3\n },\n { #hint4\n }\n ]\n constructor: (@translate) ->\n hintKey = Math.floor(Math.random() * @.HINTS.length) + 1\n\n @.hint = @.HINTS[hintKey - 1]\n\n @.hint.linkText = @.hint.linkText || 'HINTS.LINK'\n\n @.hint.title = @translate.instant(\"HINTS.HINT#{hintKey}_TITLE\")\n\n @.hint.text = @translate.instant(\"HINTS.HINT#{hintKey}_TEXT\")\n\nProfileHints.$inject = [\n \"$translate\"\n]\n\nangular.module(\"taigaProfile\").controller(\"ProfileHints\", ProfileHints)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-hints.directive.coffee\n###\n\nProfileHints = ($translate) ->\n return {\n scope: {},\n controller: \"ProfileHints\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-hints/profile-hints.html\"\n }\n\nProfileHints.$inject = [\n \"$translate\"\n]\n\nangular.module(\"taigaProfile\").directive(\"tgProfileHints\", ProfileHints)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-projects.controller.coffee\n###\n\nclass ProfileProjectsController\n @.$inject = [\n \"tgProjectsService\",\n \"tgUserService\"\n ]\n\n constructor: (@projectsService, @userService) ->\n\n loadProjects: () ->\n @projectsService.getProjectsByUserId(@.user.get(\"id\"))\n .then (projects) =>\n return @userService.attachUserContactsToProjects(@.user.get(\"id\"), projects)\n .then (projects) =>\n @.projects = projects\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileProjects\", ProfileProjectsController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-projects.directive.coffee\n###\n\nProfileProjectsDirective = () ->\n link = (scope, elm, attr, ctrl) ->\n ctrl.loadProjects()\n\n return {\n templateUrl: \"profile/profile-projects/profile-projects.html\",\n scope: {\n user: \"=\"\n },\n link: link\n bindToController: true,\n controllerAs: \"vm\",\n controller: \"ProfileProjects\"\n }\n\nangular.module(\"taigaProfile\").directive(\"tgProfileProjects\", ProfileProjectsDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-tab.directive.coffee\n###\n\nProfileTabDirective = () ->\n link = (scope, element, attrs, ctrl, transclude) ->\n scope.tab = {}\n\n attrs.$observe \"tgProfileTab\", (name) ->\n scope.tab.name = name\n\n attrs.$observe \"tabTitle\", (title) ->\n scope.tab.title = title\n\n scope.tab.icon = attrs.tabIcon\n scope.tab.active = !!attrs.tabActive\n\n if scope.$eval(attrs.tabDisabled) != true\n ctrl.addTab(scope.tab)\n\n return {\n templateUrl: \"profile/profile-tab/profile-tab.html\",\n scope: {},\n require: \"^tgProfileTabs\",\n link: link,\n transclude: true\n }\n\nangular.module(\"taigaProfile\")\n .directive(\"tgProfileTab\", ProfileTabDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-tabs.controller.coffee\n###\n\nclass ProfileTabsController\n constructor: () ->\n @tabs = []\n\n addTab: (tab) ->\n @tabs.push(tab)\n\n toggleTab: (tab) ->\n _.map @tabs, (tab) -> tab.active = false\n\n tab.active = true\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileTabs\", ProfileTabsController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-tabs.directive.coffee\n###\n\nProfileTabsDirective = () ->\n return {\n scope: {}\n controller: \"ProfileTabs\"\n controllerAs: \"vm\"\n templateUrl: \"profile/profile-tabs/profile-tabs.html\"\n transclude: true\n }\n\nangular.module(\"taigaProfile\")\n .directive(\"tgProfileTabs\", ProfileTabsDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile.controller.coffee\n###\n\nclass ProfileController\n @.$inject = [\n \"tgAppMetaService\",\n \"tgCurrentUserService\",\n \"$routeParams\",\n \"tgUserService\",\n \"tgXhrErrorService\",\n \"$translate\"\n ]\n\n constructor: (@appMetaService, @currentUserService, @routeParams, @userService, @xhrError, @translate) ->\n @.isCurrentUser = false\n\n if @routeParams.slug\n @userService\n .getUserByUserName(@routeParams.slug)\n .then (user) =>\n if !user.get('is_active')\n @xhrError.notFound()\n else\n @.user = user\n @.isCurrentUser = false\n @._setMeta(@.user)\n\n return user\n .catch (xhr) =>\n return @xhrError.response(xhr)\n\n else\n @.user = @currentUserService.getUser()\n @.isCurrentUser = true\n @._setMeta(@.user)\n\n _setMeta: (user) ->\n ctx = {\n userFullName: user.get(\"full_name_display\"),\n userUsername: user.get(\"username\")\n }\n\n title = @translate.instant(\"USER.PROFILE.PAGE_TITLE\", ctx)\n\n description = user.get(\"bio\")\n @appMetaService.setAll(title, description)\n\nangular.module(\"taigaProfile\").controller(\"Profile\", ProfileController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: like-project-button.controller.coffee\n###\n\nclass LikeProjectButtonController\n @.$inject = [\n \"$tgConfirm\"\n \"tgLikeProjectButtonService\"\n ]\n\n constructor: (@confirm, @likeButtonService)->\n @.isMouseOver = false\n @.loading = false\n\n showTextWhenMouseIsOver: ->\n @.isMouseOver = true\n\n showTextWhenMouseIsLeave: ->\n @.isMouseOver = false\n\n toggleLike: ->\n @.loading = true\n\n if not @.project.get(\"is_fan\")\n promise = @._like()\n else\n promise = @._unlike()\n\n promise.finally () => @.loading = false\n\n return promise\n\n _like: ->\n return @likeButtonService.like(@.project.get('id'))\n .then =>\n @.showTextWhenMouseIsLeave()\n .catch =>\n @confirm.notify(\"error\")\n\n _unlike: ->\n return @likeButtonService.unlike(@.project.get('id')).catch =>\n @confirm.notify(\"error\")\n\nangular.module(\"taigaProjects\").controller(\"LikeProjectButton\", LikeProjectButtonController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: like-project-button.directive.coffee\n###\n\nLikeProjectButtonDirective = ->\n return {\n scope: {}\n controller: \"LikeProjectButton\",\n bindToController: {\n project: '='\n }\n controllerAs: \"vm\",\n templateUrl: \"projects/components/like-project-button/like-project-button.html\",\n }\n\nangular.module(\"taigaProjects\").directive(\"tgLikeProjectButton\", LikeProjectButtonDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: like-project-button.service.coffee\n###\n\ntaiga = @.taiga\n\nclass LikeProjectButtonService extends taiga.Service\n @.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"]\n\n constructor: (@rs, @currentUserService, @projectService) ->\n\n _getProjectIndex: (projectId) ->\n return @currentUserService.projects\n .get('all')\n .findIndex (project) -> project.get('id') == projectId\n\n _updateProjects: (projectId, isFan) ->\n projectIndex = @._getProjectIndex(projectId)\n projects = @currentUserService.projects\n .get('all')\n .update projectIndex, (project) ->\n\n totalFans = project.get(\"total_fans\")\n\n if isFan then totalFans++ else totalFans--\n\n return project.merge({\n is_fan: isFan,\n total_fans: totalFans\n })\n\n @currentUserService.setProjects(projects)\n\n _updateCurrentProject: (isFan) ->\n totalFans = @projectService.project.get(\"total_fans\")\n\n if isFan then totalFans++ else totalFans--\n\n project = @projectService.project.merge({\n is_fan: isFan,\n total_fans: totalFans\n })\n\n @projectService.setProject(project)\n\n like: (projectId) ->\n return @rs.projects.likeProject(projectId).then =>\n @._updateProjects(projectId, true)\n @._updateCurrentProject(true)\n\n unlike: (projectId) ->\n return @rs.projects.unlikeProject(projectId).then =>\n @._updateProjects(projectId, false)\n @._updateCurrentProject(false)\n\nangular.module(\"taigaProjects\").service(\"tgLikeProjectButtonService\", LikeProjectButtonService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: sort-projects.directive.coffee\n###\n\nSortProjectsDirective = (currentUserService) ->\n link = (scope, el, attrs, ctrl) ->\n itemEl = null\n\n el.sortable({\n dropOnEmpty: true\n revert: 200\n axis: \"y\"\n opacity: .95\n placeholder: 'placeholder'\n cancel: '.project-name'\n })\n\n el.on \"sortstop\", (event, ui) ->\n itemEl = ui.item\n project = itemEl.scope().project\n index = itemEl.index()\n\n sorted_project_ids = _.map(scope.projects.toJS(), (p) -> p.id)\n sorted_project_ids = _.without(sorted_project_ids, project.get(\"id\"))\n sorted_project_ids.splice(index, 0, project.get('id'))\n\n sortData = []\n\n for value, index in sorted_project_ids\n sortData.push({\"project_id\": value, \"order\":index})\n\n currentUserService.bulkUpdateProjectsOrder(sortData)\n\n directive = {\n scope: {\n projects: \"=tgSortProjects\"\n },\n link: link\n }\n\n return directive\n\nangular.module(\"taigaProjects\").directive(\"tgSortProjects\", [\"tgCurrentUserService\", SortProjectsDirective])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-project-button.controller.coffee\n###\n\nclass WatchProjectButtonController\n @.$inject = [\n \"$tgConfirm\"\n \"tgWatchProjectButtonService\"\n ]\n\n constructor: (@confirm, @watchButtonService)->\n @.showWatchOptions = false\n @.loading = false\n\n toggleWatcherOptions: () ->\n @.showWatchOptions = !@.showWatchOptions\n\n closeWatcherOptions: () ->\n @.showWatchOptions = false\n\n watch: (notifyLevel) ->\n @.loading = true\n @.closeWatcherOptions()\n\n return @watchButtonService.watch(@.project.get('id'), notifyLevel)\n .catch () => @confirm.notify(\"error\")\n .finally () => @.loading = false\n\n unwatch: ->\n @.loading = true\n @.closeWatcherOptions()\n\n return @watchButtonService.unwatch(@.project.get('id'))\n .catch () => @confirm.notify(\"error\")\n .finally () => @.loading = false\n\nangular.module(\"taigaProjects\").controller(\"WatchProjectButton\", WatchProjectButtonController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-project-button.directive.coffee\n###\n\nWatchProjectButtonDirective = ->\n return {\n scope: {}\n controller: \"WatchProjectButton\",\n bindToController: {\n project: \"=\"\n }\n controllerAs: \"vm\",\n templateUrl: \"projects/components/watch-project-button/watch-project-button.html\",\n }\n\nangular.module(\"taigaProjects\").directive(\"tgWatchProjectButton\", WatchProjectButtonDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-project-button.service.coffee\n###\n\ntaiga = @.taiga\n\nclass WatchProjectButtonService extends taiga.Service\n @.$inject = [\n \"tgResources\",\n \"tgCurrentUserService\",\n \"tgProjectService\"\n ]\n\n constructor: (@rs, @currentUserService, @projectService) ->\n\n _getProjectIndex: (projectId) ->\n return @currentUserService.projects\n .get('all')\n .findIndex (project) -> project.get('id') == projectId\n\n\n _updateProjects: (projectId, notifyLevel, isWatcher) ->\n projectIndex = @._getProjectIndex(projectId)\n\n projects = @currentUserService.projects\n .get('all')\n .update projectIndex, (project) =>\n totalWatchers = project.get('total_watchers')\n\n if isWatcher then totalWatchers++ else totalWatchers--\n\n return project.merge({\n is_watcher: isWatcher,\n total_watchers: totalWatchers\n notify_level: notifyLevel\n })\n\n @currentUserService.setProjects(projects)\n\n _updateCurrentProject: (notifyLevel, isWatcher) ->\n totalWatchers = @projectService.project.get(\"total_watchers\")\n\n if isWatcher then totalWatchers++ else totalWatchers--\n\n project = @projectService.project.merge({\n is_watcher: isWatcher,\n total_watchers: totalWatchers\n notify_level: notifyLevel\n })\n\n @projectService.setProject(project)\n\n watch: (projectId, notifyLevel) ->\n return @rs.projects.watchProject(projectId, notifyLevel).then =>\n @._updateProjects(projectId, notifyLevel, true)\n @._updateCurrentProject(notifyLevel, true)\n\n unwatch: (projectId) ->\n return @rs.projects.unwatchProject(projectId).then =>\n @._updateProjects(projectId, null, false)\n @._updateCurrentProject(null, false)\n\nangular.module(\"taigaProjects\").service(\"tgWatchProjectButtonService\", WatchProjectButtonService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: projects-listing.controller.coffee\n###\n\nclass ProjectsListingController\n @.$inject = [\n \"tgCurrentUserService\",\n \"tgProjectsService\",\n ]\n\n constructor: (@currentUserService, @projectsService) ->\n taiga.defineImmutableProperty(@, \"projects\", () => @currentUserService.projects.get(\"all\"))\n\n newProject: ->\n @projectsService.newProject()\n\nangular.module(\"taigaProjects\").controller(\"ProjectsListing\", ProjectsListingController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: project.controller.coffee\n###\n\nclass ProjectController\n @.$inject = [\n \"$routeParams\",\n \"tgAppMetaService\",\n \"$tgAuth\",\n \"$translate\",\n \"tgProjectService\"\n ]\n\n constructor: (@routeParams, @appMetaService, @auth, @translate, @projectService) ->\n projectSlug = @routeParams.pslug\n @.user = @auth.userData\n\n taiga.defineImmutableProperty @, \"project\", () => return @projectService.project\n taiga.defineImmutableProperty @, \"members\", () => return @projectService.activeMembers\n\n @appMetaService.setfn @._setMeta.bind(this)\n\n _setMeta: (project)->\n metas = {}\n\n return metas if !@.project\n\n ctx = {projectName: @.project.get(\"name\")}\n\n metas.title = @translate.instant(\"PROJECT.PAGE_TITLE\", ctx)\n metas.description = @.project.get(\"description\")\n\n return metas\n\nangular.module(\"taigaProjects\").controller(\"Project\", ProjectController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: projects.service.coffee\n###\n\ntaiga = @.taiga\ngroupBy = @.taiga.groupBy\n\nclass ProjectsService extends taiga.Service\n @.$inject = [\"tgResources\", \"$projectUrl\", \"tgLightboxFactory\"]\n\n constructor: (@rs, @projectUrl, @lightboxFactory) ->\n\n getProjectBySlug: (projectSlug) ->\n return @rs.projects.getProjectBySlug(projectSlug)\n .then (project) =>\n return @._decorate(project)\n\n getProjectStats: (projectId) ->\n return @rs.projects.getProjectStats(projectId)\n\n getProjectsByUserId: (userId, paginate) ->\n return @rs.projects.getProjectsByUserId(userId, paginate)\n .then (projects) =>\n return projects.map @._decorate.bind(@)\n\n _decorate: (project) ->\n url = @projectUrl.get(project.toJS())\n\n project = project.set(\"url\", url)\n colorized_tags = []\n\n if project.get(\"tags\")\n tags = project.get(\"tags\").sort()\n\n colorized_tags = tags.map (tag) ->\n color = project.get(\"tags_colors\").get(tag)\n return Immutable.fromJS({name: tag, color: color})\n\n project = project.set(\"colorized_tags\", colorized_tags)\n\n return project\n\n newProject: ->\n @lightboxFactory.create(\"tg-lb-create-project\", {\n \"class\": \"wizard-create-project\"\n })\n\n bulkUpdateProjectsOrder: (sortData) ->\n return @rs.projects.bulkUpdateOrder(sortData)\n\nangular.module(\"taigaProjects\").service(\"tgProjectsService\", ProjectsService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: external-apps-resource.service.coffee\n###\n\nResource = (urlsService, http) ->\n service = {}\n\n service.getApplicationToken = (applicationId, state) ->\n url = urlsService.resolve(\"applications\")\n url = \"#{url}/#{applicationId}/token?state=#{state}\"\n return http.get(url).then (result) ->\n Immutable.fromJS(result.data)\n\n service.authorizeApplicationToken = (applicationId, state) ->\n url = urlsService.resolve(\"application-tokens\")\n url = \"#{url}/authorize\"\n data = {\n \"state\": state\n \"application\": applicationId\n }\n\n return http.post(url, data).then (result) ->\n Immutable.fromJS(result.data)\n\n return () ->\n return {\"externalapps\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgExternalAppsResource\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: issues-resource.service.coffee\n###\n\nResource = (urlsService, http) ->\n service = {}\n\n service.listInAllProjects = (params) ->\n url = urlsService.resolve(\"issues\")\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n return () ->\n return {\"issues\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgIssuesResource\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: projects-resource.service.coffee\n###\n\npagination = () ->\n\nResource = (urlsService, http, paginateResponseService) ->\n service = {}\n\n service.getProjectBySlug = (projectSlug) ->\n url = urlsService.resolve(\"projects\")\n\n url = \"#{url}/by_slug?slug=#{projectSlug}\"\n\n return http.get(url)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getProjectsByUserId = (userId, paginate=false) ->\n url = urlsService.resolve(\"projects\")\n httpOptions = {}\n\n if !paginate\n httpOptions.headers = {\n \"x-disable-pagination\": \"1\"\n }\n\n params = {\"member\": userId, \"order_by\": \"memberships__user_order\"}\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getProjectStats = (projectId) ->\n url = urlsService.resolve(\"projects\")\n url = \"#{url}/#{projectId}\"\n\n return http.get(url)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.bulkUpdateOrder = (bulkData) ->\n url = urlsService.resolve(\"bulk-update-projects-order\")\n return http.post(url, bulkData)\n\n service.getTimeline = (projectId, page) ->\n params = {\n page: page\n }\n\n url = urlsService.resolve(\"timeline-project\")\n url = \"#{url}/#{projectId}\"\n\n return http.get(url, params).then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.likeProject = (projectId) ->\n url = urlsService.resolve(\"project-like\", projectId)\n return http.post(url)\n\n service.unlikeProject = (projectId) ->\n url = urlsService.resolve(\"project-unlike\", projectId)\n return http.post(url)\n\n service.watchProject = (projectId, notifyPolicy) ->\n data = {\n notify_policy: notifyPolicy\n }\n url = urlsService.resolve(\"project-watch\", projectId)\n return http.post(url, data)\n\n service.unwatchProject = (projectId) ->\n url = urlsService.resolve(\"project-unwatch\", projectId)\n return http.post(url)\n\n return () ->\n return {\"projects\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgProjectsResources\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: resources.coffee\n###\n\nservices = [\n \"tgProjectsResources\",\n \"tgUserResources\",\n \"tgUsersResources\",\n \"tgUserstoriesResource\",\n \"tgTasksResource\",\n \"tgIssuesResource\",\n \"tgExternalAppsResource\"\n]\n\nResources = ($injector) ->\n for serviceName in services\n serviceFn = $injector.get(serviceName)\n\n service = $injector.invoke(serviceFn)\n\n for serviceProperty in Object.keys(service)\n if @[serviceProperty]\n console.warm(\"repeated resource \" + serviceProperty)\n\n @[serviceProperty] = service[serviceProperty]\n\n return @\n\n\nResources.$inject = [\"$injector\"]\n\nangular.module(\"taigaResources2\").service(\"tgResources\", Resources)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: tasks-resource.service.coffee\n###\n\nResource = (urlsService, http) ->\n service = {}\n\n service.listInAllProjects = (params) ->\n url = urlsService.resolve(\"tasks\")\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n return () ->\n return {\"tasks\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgTasksResource\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-resource.service.coffee\n###\n\nResource = (urlsService, http, paginateResponseService) ->\n service = {}\n\n service.getUserStorage = (key) ->\n url = urlsService.resolve(\"user-storage\")\n\n if key\n url += '/' + key\n\n httpOptions = {}\n\n return http.get(url, {}).then (response) ->\n return response.data.value\n\n service.setUserStorage = (key, value) ->\n url = urlsService.resolve(\"user-storage\") + '/' + key\n\n params = {\n key: key,\n value: value\n }\n\n return http.put(url, params)\n\n service.createUserStorage = (key, value) ->\n url = urlsService.resolve(\"user-storage\")\n\n params = {\n key: key,\n value: value\n }\n\n return http.post(url, params)\n\n return () ->\n return {\"user\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgUserResources\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: users-resource.service.coffee\n###\n\nResource = (urlsService, http, paginateResponseService) ->\n service = {}\n\n service.getUserByUsername = (username) ->\n url = urlsService.resolve(\"by_username\")\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n params = {\n username: username\n }\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getStats = (userId) ->\n url = urlsService.resolve(\"user-stats\", userId)\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, {}, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getContacts = (userId) ->\n url = urlsService.resolve(\"user-contacts\", userId)\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, {}, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getLiked = (userId, page, type, q) ->\n url = urlsService.resolve(\"user-liked\", userId)\n\n params = {}\n params.page = page if page?\n params.type = type if type?\n params.q = q if q?\n\n return http.get(url, params)\n .then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.getVoted = (userId, page, type, q) ->\n url = urlsService.resolve(\"user-voted\", userId)\n\n params = {}\n params.page = page if page?\n params.type = type if type?\n params.q = q if q?\n\n return http.get(url, params)\n .then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.getWatched = (userId, page, type, q) ->\n url = urlsService.resolve(\"user-watched\", userId)\n\n params = {}\n params.page = page if page?\n params.type = type if type?\n params.q = q if q?\n\n return http.get(url, params)\n .then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.getProfileTimeline = (userId, page) ->\n params = {\n page: page\n }\n\n url = urlsService.resolve(\"timeline-profile\")\n url = \"#{url}/#{userId}\"\n\n return http.get(url, params).then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.getUserTimeline = (userId, page) ->\n params = {\n page: page\n }\n\n url = urlsService.resolve(\"timeline-user\")\n url = \"#{url}/#{userId}\"\n\n return http.get(url, params).then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n return () ->\n return {\"users\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgUsersResources\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: userstories-resource.service.coffee\n###\n\nResource = (urlsService, http) ->\n service = {}\n\n service.listInAllProjects = (params) ->\n url = urlsService.resolve(\"userstories\")\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n return () ->\n return {\"userstories\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgUserstoriesResource\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: app-meta.service.coffee\n###\n\ntaiga = @.taiga\n\ntruncate = taiga.truncate\n\n\nclass AppMetaService\n @.$inject = [\n \"$rootScope\"\n ]\n\n constructor: (@rootScope) ->\n\n _set: (key, value) ->\n return if not key\n\n if key == \"title\"\n meta = $(\"title\")\n\n if meta.length == 0\n meta = $(\"\")\n $(\"head\").append(meta)\n\n meta.text(value or \"\")\n else if key.indexOf(\"og:\") == 0\n meta = $(\"meta[property='#{key}']\")\n\n if meta.length == 0\n meta = $(\"\")\n $(\"head\").append(meta)\n\n meta.attr(\"content\", value or \"\")\n else\n meta = $(\"meta[name='#{key}']\")\n\n if meta.length == 0\n meta = $(\"\")\n $(\"head\").append(meta)\n\n meta.attr(\"content\", value or \"\")\n\n setTitle: (title) ->\n @._set('title', title)\n\n setDescription: (description) ->\n @._set(\"description\", truncate(description, 250))\n\n setTwitterMetas: (title, description) ->\n @._set(\"twitter:card\", \"summary\")\n @._set(\"twitter:site\", \"@taigaio\")\n @._set(\"twitter:title\", title)\n @._set(\"twitter:description\", truncate(description, 300))\n @._set(\"twitter:image\", \"#{window.location.origin}/images/logo-color.png\")\n\n setOpenGraphMetas: (title, description) ->\n @._set(\"og:type\", \"object\")\n @._set(\"og:site_name\", \"Taiga - Love your projects\")\n @._set(\"og:title\", title)\n @._set(\"og:description\", truncate(description, 300))\n @._set(\"og:image\", \"#{window.location.origin}/images/logo-color.png\")\n @._set(\"og:url\", window.location.href)\n\n setAll: (title, description) ->\n @.setTitle(title)\n @.setDescription(description)\n @.setTwitterMetas(title, description)\n @.setOpenGraphMetas(title, description)\n\n addMobileViewport: () ->\n $(\"head\").append(\n \"\"\n )\n\n removeMobileViewport: () ->\n $(\"meta[name=\\\"viewport\\\"]\").remove()\n\n setfn: (fn) ->\n @._listener() if @.listener\n\n @._listener = @rootScope.$watchCollection fn, (metas) =>\n @.setAll(metas.title, metas.description)\n\n\nangular.module(\"taigaCommon\").service(\"tgAppMetaService\", AppMetaService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: check-permissions.service.coffee\n###\n\ntaiga = @.taiga\n\nclass ChekcPermissionsService\n @.$inject = [\n \"tgProjectService\"\n ]\n\n constructor: (@projectService) ->\n\n check: (permission) ->\n return @projectService.project.get('my_permissions').indexOf(permission) != -1\n\nangular.module(\"taigaCommon\").service(\"tgCheckPermissionsService\", ChekcPermissionsService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: current-user.service.coffee\n###\n\ntaiga = @.taiga\n\ngroupBy = @.taiga.groupBy\n\nclass CurrentUserService\n @.$inject = [\n \"tgProjectsService\",\n \"$tgStorage\",\n \"tgResources\"\n ]\n\n constructor: (@projectsService, @storageService, @rs) ->\n @._user = null\n @._projects = Immutable.Map()\n @._projectsById = Immutable.Map()\n @._joyride = null\n\n taiga.defineImmutableProperty @, \"projects\", () => return @._projects\n taiga.defineImmutableProperty @, \"projectsById\", () => return @._projectsById\n\n isAuthenticated: ->\n if @.getUser() != null\n return true\n return false\n\n getUser: () ->\n if !@._user\n userData = @storageService.get(\"userInfo\")\n\n if userData\n userData = Immutable.fromJS(userData)\n @.setUser(userData)\n\n return @._user\n\n removeUser: () ->\n @._user = null\n @._projects = Immutable.Map()\n @._projectsById = Immutable.Map()\n @._joyride = null\n\n setUser: (user) ->\n @._user = user\n\n return @._loadUserInfo()\n\n bulkUpdateProjectsOrder: (sortData) ->\n @projectsService.bulkUpdateProjectsOrder(sortData).then () =>\n @.loadProjects()\n\n loadProjects: () ->\n return @projectsService.getProjectsByUserId(@._user.get(\"id\"))\n .then (projects) => @.setProjects(projects)\n\n disableJoyRide: (section) ->\n if section\n @._joyride[section] = false\n else\n @._joyride = {\n backlog: false,\n kanban: false,\n dashboard: false\n }\n\n @rs.user.setUserStorage('joyride', @._joyride)\n\n loadJoyRideConfig: () ->\n return new Promise (resolve) =>\n if @._joyride != null\n resolve(@._joyride)\n return\n\n @rs.user.getUserStorage('joyride')\n .then (config) =>\n @._joyride = config\n resolve(@._joyride)\n .catch () =>\n #joyride not defined\n @._joyride = {\n backlog: true,\n kanban: true,\n dashboard: true\n }\n\n @rs.user.createUserStorage('joyride', @._joyride)\n\n resolve(@._joyride)\n\n _loadUserInfo: () ->\n return Promise.all([\n @.loadProjects()\n ])\n\n setProjects: (projects) ->\n @._projects = @._projects.set(\"all\", projects)\n @._projects = @._projects.set(\"recents\", projects.slice(0, 10))\n\n @._projectsById = Immutable.fromJS(groupBy(projects.toJS(), (p) -> p.id))\n\n return @.projects\n\nangular.module(\"taigaCommon\").service(\"tgCurrentUserService\", CurrentUserService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: lightbox-factory.service.coffee\n###\n\nclass LightboxFactory\n @.$inject = [\"$rootScope\", \"$compile\"]\n constructor: (@rootScope, @compile) ->\n\n create: (name, attrs) ->\n scope = @rootScope.$new()\n\n elm = $(\"
\")\n .attr(name, true)\n .attr(\"tg-bind-scope\", true)\n\n if attrs\n elm.attr(attrs)\n\n elm.addClass(\"remove-on-close\")\n\n html = @compile(elm)(scope)\n\n $(document.body).append(html)\n\n return\n\nangular.module(\"taigaCommon\").service(\"tgLightboxFactory\", LightboxFactory)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: paginate-response.service.coffee\n###\n\nPaginateResponse = () ->\n return (result) ->\n paginateResponse = Immutable.Map({\n \"data\": result.get(\"data\"),\n \"next\": !!result.get(\"headers\")(\"x-pagination-next\"),\n \"prev\": !!result.get(\"headers\")(\"x-pagination-prev\"),\n \"current\": result.get(\"headers\")(\"x-pagination-current\"),\n \"count\": result.get(\"headers\")(\"x-pagination-count\")\n })\n\n return paginateResponse\n\nangular.module(\"taigaCommon\").factory(\"tgPaginateResponseService\", PaginateResponse)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: project.service.coffee\n###\n\ntaiga = @.taiga\n\nclass ProjectService\n @.$inject = [\n \"tgProjectsService\",\n \"tgXhrErrorService\"\n ]\n\n constructor: (@projectsService, @xhrError) ->\n @._project = null\n @._section = null\n @._sectionsBreadcrumb = Immutable.List()\n @._activeMembers = Immutable.List()\n\n taiga.defineImmutableProperty @, \"project\", () => return @._project\n taiga.defineImmutableProperty @, \"section\", () => return @._section\n taiga.defineImmutableProperty @, \"sectionsBreadcrumb\", () => return @._sectionsBreadcrumb\n taiga.defineImmutableProperty @, \"activeMembers\", () => return @._activeMembers\n\n setSection: (section) ->\n @._section = section\n\n if section\n @._sectionsBreadcrumb = @._sectionsBreadcrumb.push(@._section)\n else\n @._sectionsBreadcrumb = Immutable.List()\n\n setProjectBySlug: (pslug) ->\n return new Promise (resolve, reject) =>\n if !@.project || @.project.get('slug') != pslug\n @projectsService\n .getProjectBySlug(pslug)\n .then (project) =>\n @.setProject(project)\n resolve()\n .catch (xhr) =>\n @xhrError.response(xhr)\n\n else resolve()\n\n setProject: (project) ->\n @._project = project\n @._activeMembers = @._project.get('members').filter (member) -> member.get('is_active')\n\n cleanProject: () ->\n @._project = null\n @._activeMembers = Immutable.List()\n @._section = null\n @._sectionsBreadcrumb = Immutable.List()\n\n fetchProject: () ->\n pslug = @.project.get('slug')\n\n return @projectsService.getProjectBySlug(pslug).then (project) => @.setProject(project)\n\nangular.module(\"taigaCommon\").service(\"tgProjectService\", ProjectService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: scope-event.service.coffee\n###\n\nclass ScopeEvent\n scopes: {},\n _searchDuplicatedScopes: (id) ->\n return _.find Object.keys(@scopes), (key) =>\n return @scopes[key].$id == id\n\n _create: (name, scope) ->\n duplicatedScopeName = @._searchDuplicatedScopes(scope.$id)\n\n if duplicatedScopeName\n throw new Error(\"scopeEvent: this scope is already\n register with the name \\\"\" + duplicatedScopeName + \"\\\"\")\n\n if @scopes[name]\n throw new Error(\"scopeEvent: \\\"\" + name + \"\\\" already in use\")\n else\n scope._tgEmitter = new EventEmitter2()\n\n scope.$on \"$destroy\", () =>\n scope._tgEmitter.removeAllListeners()\n delete @scopes[name]\n\n @scopes[name] = scope\n\n emitter: (name, scope) ->\n if scope\n scope = @._create(name, scope)\n else if @scopes[name]\n scope = @scopes[name]\n else\n throw new Error(\"scopeEvent: \\\"\" + name + \"\\\" scope doesn't exist'\")\n\n return scope._tgEmitter\n\nangular.module(\"taigaCommon\").service(\"tgScopeEvent\", ScopeEvent)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: theme.service.coffee\n###\n\ntaiga = @.taiga\n\n\nclass ThemeService extends taiga.Service = ->\n use: (themeName) ->\n stylesheetEl = $(\"link[rel='stylesheet']\")\n\n if stylesheetEl.length == 0\n stylesheetEl = $(\"\")\n $(\"head\").append(stylesheetEl)\n\n stylesheetEl.attr(\"href\", \"/styles/theme-#{themeName}.css\")\n\n\nangular.module(\"taigaCommon\").service(\"tgThemeService\", ThemeService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user.service.coffee\n###\n\ntaiga = @.taiga\nbindMethods = taiga.bindMethods\n\n\nclass UserService extends taiga.Service\n @.$inject = [\"tgResources\"]\n\n constructor: (@rs) ->\n bindMethods(@)\n\n getUserByUserName: (username) ->\n return @rs.users.getUserByUsername(username)\n\n getContacts: (userId) ->\n return @rs.users.getContacts(userId)\n\n getLiked: (userId, pageNumber, objectType, textQuery) ->\n return @rs.users.getLiked(userId, pageNumber, objectType, textQuery)\n\n getVoted: (userId, pageNumber, objectType, textQuery) ->\n return @rs.users.getVoted(userId, pageNumber, objectType, textQuery)\n\n getWatched: (userId, pageNumber, objectType, textQuery) ->\n return @rs.users.getWatched(userId, pageNumber, objectType, textQuery)\n\n getStats: (userId) ->\n return @rs.users.getStats(userId)\n\n attachUserContactsToProjects: (userId, projects) ->\n return @.getContacts(userId)\n .then (contacts) ->\n projects = projects.map (project) ->\n contactsFiltered = contacts.filter (contact) ->\n contactId = contact.get(\"id\")\n return project.get('members').indexOf(contactId) != -1\n\n project = project.set(\"contacts\", contactsFiltered)\n\n return project\n\n return projects\n\nangular.module(\"taigaCommon\").service(\"tgUserService\", UserService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: xhrError.service.coffee\n###\n\nclass xhrError extends taiga.Service\n @.$inject = [\n \"$q\",\n \"$location\",\n \"$tgNavUrls\"\n ]\n\n constructor: (@q, @location, @navUrls) ->\n\n notFound: () ->\n @location.path(@navUrls.resolve(\"not-found\"))\n @location.replace()\n\n permissionDenied: () ->\n @location.path(@navUrls.resolve(\"permission-denied\"))\n @location.replace()\n\n response: (xhr) ->\n if xhr\n if xhr.status == 404\n @.notFound()\n\n else if xhr.status == 403\n @.permissionDenied()\n\n return @q.reject(xhr)\n\nangular.module(\"taigaCommon\").service(\"tgXhrErrorService\", xhrError)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-attachment.directive.coffee\n###\n\nUserTimelineAttachmentDirective = (template, $compile) ->\n validFileExtensions = [\".jpg\", \".jpeg\", \".bmp\", \".gif\", \".png\"]\n\n isImage = (url) ->\n url = url.toLowerCase()\n\n return _.some validFileExtensions, (extension) ->\n return url.indexOf(extension, url - extension.length) != -1\n\n link = (scope, el) ->\n is_image = isImage(scope.attachment.get('url'))\n\n if is_image\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment-image.html\")\n else\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment.html\")\n\n el.html(templateHtml)\n $compile(el.contents())(scope)\n\n el.find(\"img\").error () -> @.remove()\n\n return {\n link: link\n scope: {\n attachment: \"=tgUserTimelineAttachment\"\n }\n }\n\nUserTimelineAttachmentDirective.$inject = [\n \"$tgTemplate\",\n \"$compile\"\n]\n\nangular.module(\"taigaUserTimeline\")\n .directive(\"tgUserTimelineAttachment\", UserTimelineAttachmentDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-item-title.service.coffee\n###\n\nunslugify = @.taiga.unslugify\n\nclass UserTimelineItemTitle\n @.$inject = [\n \"$translate\"\n ]\n\n _fieldTranslationKey: {\n 'status': 'COMMON.FIELDS.STATUS',\n 'subject': 'COMMON.FIELDS.SUBJECT',\n 'description_diff': 'COMMON.FIELDS.DESCRIPTION',\n 'points': 'COMMON.FIELDS.POINTS',\n 'assigned_to': 'COMMON.FIELDS.ASSIGNED_TO',\n 'severity': 'ISSUES.FIELDS.SEVERITY',\n 'priority': 'ISSUES.FIELDS.PRIORITY',\n 'type': 'ISSUES.FIELDS.TYPE',\n 'is_iocaine': 'TASK.FIELDS.IS_IOCAINE',\n 'is_blocked': 'COMMON.FIELDS.IS_BLOCKED'\n }\n\n _params: {\n username: (timeline, event) ->\n user = timeline.getIn(['data', 'user'])\n\n if user.get('is_profile_visible')\n title_attr = @translate.instant('COMMON.SEE_USER_PROFILE', {username: user.get('username')})\n url = \"user-profile:username=timeline.getIn(['data', 'user', 'username'])\"\n\n return @._getLink(url, user.get('name'), title_attr)\n else\n return @._getUsernameSpan(user.get('name'))\n\n field_name: (timeline, event) ->\n field_name = timeline.getIn(['data', 'value_diff', 'key'])\n\n return @translate.instant(@._fieldTranslationKey[field_name])\n\n project_name: (timeline, event) ->\n url = \"project:project=timeline.getIn(['data', 'project', 'slug'])\"\n\n return @._getLink(url, timeline.getIn([\"data\", \"project\", \"name\"]))\n\n new_value: (timeline, event) ->\n if _.isArray(timeline.getIn([\"data\", \"value_diff\", \"value\"]).toJS())\n value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).get(1)\n\n # assigned to unasigned\n if value == null && timeline.getIn([\"data\", \"value_diff\", \"key\"]) == 'assigned_to'\n value = @translate.instant('ACTIVITY.VALUES.UNASSIGNED')\n\n return value\n else\n return timeline.getIn([\"data\", \"value_diff\", \"value\"]).first().get(1)\n\n sprint_name: (timeline, event) ->\n url = \"project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])\"\n\n return @._getLink(url, timeline.getIn(['data', 'milestone', 'name']))\n\n us_name: (timeline, event) ->\n obj = @._getTimelineObj(timeline, event).get('userstory')\n\n event_us = {obj: 'parent_userstory'}\n url = @._getDetailObjUrl(event_us)\n\n text = '#' + obj.get('ref') + ' ' + obj.get('subject')\n\n return @._getLink(url, text)\n\n obj_name: (timeline, event) ->\n obj = @._getTimelineObj(timeline, event)\n url = @._getDetailObjUrl(event)\n\n if event.obj == 'wikipage'\n text = unslugify(obj.get('slug'))\n else if event.obj == 'milestone'\n text = obj.get('name')\n else\n text = '#' + obj.get('ref') + ' ' + obj.get('subject')\n\n return @._getLink(url, text)\n\n role_name: (timeline, event) ->\n return timeline.getIn(['data', 'value_diff', 'value']).keySeq().first()\n }\n\n constructor: (@translate) ->\n\n\n _translateTitleParams: (param, timeline, event) ->\n return @._params[param].call(this, timeline, event)\n\n _getTimelineObj: (timeline, event) ->\n return timeline.getIn(['data', event.obj])\n\n _getDetailObjUrl: (event) ->\n url = {\n \"issue\": [\"project-issues-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"wikipage\": [\"project-wiki-page\", \":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])\"],\n \"task\": [\"project-tasks-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"parent_userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])\"],\n \"milestone\": [\"project-taskboard\", \":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])\"]\n }\n\n return url[event.obj][0] + url[event.obj][1]\n\n _getLink: (url, text, title) ->\n title = title || text\n\n return $('')\n .attr('tg-nav', url)\n .text(text)\n .attr('title', title)\n .prop('outerHTML')\n\n _getUsernameSpan: (text) ->\n title = title || text\n\n return $('')\n .addClass('username')\n .text(text)\n .prop('outerHTML')\n\n _getParams: (timeline, event, timeline_type) ->\n params = {}\n\n timeline_type.translate_params.forEach (param) =>\n params[param] = @._translateTitleParams(param, timeline, event)\n\n return params\n\n getTitle: (timeline, event, type) ->\n return @translate.instant(type.key, @._getParams(timeline, event, type))\n\nangular.module(\"taigaUserTimeline\")\n .service(\"tgUserTimelineItemTitle\", UserTimelineItemTitle)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-item-type.service.coffee\n###\n\ntimelineType = (timeline, event) ->\n types = [\n { # NewMember\n check: (timeline, event) ->\n return event.obj == 'membership'\n key: 'TIMELINE.NEW_MEMBER',\n translate_params: ['project_name']\n member: (timeline) ->\n return Immutable.Map({\n user: timeline.getIn(['data', 'user']),\n role: timeline.getIn(['data', 'role'])\n })\n },\n { # NewProject\n check: (timeline, event) ->\n return event.obj == 'project' && event.type == 'create'\n key: 'TIMELINE.NEW_PROJECT',\n translate_params: ['username', 'project_name'],\n description: (timeline) ->\n return timeline.getIn(['data', 'project', 'description'])\n },\n { # NewAttachment\n check: (timeline, event) ->\n return event.type == 'change' &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'attachments'\n key: 'TIMELINE.UPLOAD_ATTACHMENT',\n translate_params: ['username', 'obj_name']\n },\n { # NewUs\n check: (timeline, event) ->\n return event.obj == 'userstory' && event.type == 'create'\n key: 'TIMELINE.US_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewIssue\n check: (timeline, event) ->\n return event.obj == 'issue' && event.type == 'create'\n key: 'TIMELINE.ISSUE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewWiki\n check: (timeline, event) ->\n return event.obj == 'wikipage' && event.type == 'create'\n key: 'TIMELINE.WIKI_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewTask\n check: (timeline, event) ->\n return event.obj == 'task' && event.type == 'create' && !timeline.getIn(['data', 'task', 'userstory'])\n key: 'TIMELINE.TASK_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewTask with US\n check: (timeline, event) ->\n return event.obj == 'task' && event.type == 'create' && timeline.getIn(['data', 'task', 'userstory'])\n key: 'TIMELINE.TASK_CREATED_WITH_US',\n translate_params: ['username', 'project_name', 'obj_name', 'us_name']\n },\n { # NewMilestone\n check: (timeline, event) ->\n return event.obj == 'milestone' && event.type == 'create'\n key: 'TIMELINE.MILESTONE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewUsComment\n check: (timeline, event) ->\n return timeline.getIn(['data', 'comment']) && event.obj == 'userstory'\n key: 'TIMELINE.NEW_COMMENT_US',\n translate_params: ['username', 'obj_name'],\n description: (timeline) ->\n return $(timeline.getIn(['data', 'comment_html'])).text()\n },\n { # NewIssueComment\n check: (timeline, event) ->\n return timeline.getIn(['data', 'comment']) && event.obj == 'issue'\n key: 'TIMELINE.NEW_COMMENT_ISSUE',\n translate_params: ['username', 'obj_name'],\n description: (timeline) ->\n return $(timeline.getIn(['data', 'comment_html'])).text()\n },\n { # NewTaskComment\n check: (timeline, event) ->\n return timeline.getIn(['data', 'comment']) && event.obj == 'task'\n key: 'TIMELINE.NEW_COMMENT_TASK'\n translate_params: ['username', 'obj_name'],\n description: (timeline) ->\n return $(timeline.getIn(['data', 'comment_html'])).text()\n },\n { # UsMove\n check: (timeline, event) ->\n return timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'moveInBacklog' &&\n timeline.hasIn(['data', 'value_diff', 'value', 'backlog_order']) &&\n event.type == 'change'\n key: 'TIMELINE.US_MOVED',\n translate_params: ['username', 'obj_name']\n },\n { # UsToBacklog\n check: (timeline, event) ->\n if timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'moveInBacklog' &&\n event.type == 'change'\n\n return timeline.getIn(['data', 'value_diff', 'value', 'milestone']).get(1) == null\n\n return false\n key: 'TIMELINE.US_REMOVED_FROM_MILESTONE',\n translate_params: ['username', 'obj_name']\n },\n { # UsToMilestone\n check: (timeline, event) ->\n return timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'moveInBacklog' &&\n event.type == 'change'\n key: 'TIMELINE.US_ADDED_MILESTONE',\n translate_params: ['username', 'obj_name', 'sprint_name']\n },\n { # Blocked\n check: (timeline, event) ->\n if timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'blocked' &&\n event.type == 'change'\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) == true\n\n return false\n key: 'TIMELINE.BLOCKED',\n translate_params: ['username', 'obj_name'],\n description: (timeline) ->\n if timeline.hasIn(['data', 'value_diff', 'value', 'blocked_note_html'])\n return $(timeline.getIn(['data', 'value_diff', 'value', 'blocked_note_html']).get(1)).text()\n else\n return false\n },\n { # UnBlocked\n check: (timeline, event) ->\n if timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'blocked' &&\n event.type == 'change'\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) == false\n\n return false\n key: 'TIMELINE.UNBLOCKED',\n translate_params: ['username', 'obj_name']\n },\n { # MilestoneUpdated\n check: (timeline, event) ->\n return event.obj == 'milestone' && event.type == 'change'\n key: 'TIMELINE.MILESTONE_UPDATED',\n translate_params: ['username', 'obj_name']\n },\n { # WikiUpdated\n check: (timeline, event) ->\n return event.obj == 'wikipage' && event.type == 'change'\n key: 'TIMELINE.WIKI_UPDATED',\n translate_params: ['username', 'obj_name']\n },\n { # UsUpdated points\n check: (timeline, event) ->\n return event.obj == 'userstory' &&\n event.type == 'change' &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'points'\n key: 'TIMELINE.US_UPDATED_POINTS',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value', 'role_name']\n },\n { # UsUpdated description\n check: (timeline, event) ->\n return event.obj == 'userstory' &&\n event.type == 'change' &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'description_diff'\n key: 'TIMELINE.US_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n },\n { # UsUpdated general\n check: (timeline, event) ->\n return event.obj == 'userstory' &&\n event.type == 'change'\n key: 'TIMELINE.US_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n },\n { # IssueUpdated description\n check: (timeline, event) ->\n return event.obj == 'issue' &&\n event.type == 'change' &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'description_diff'\n key: 'TIMELINE.ISSUE_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n },\n { # IssueUpdated general\n check: (timeline, event) ->\n return event.obj == 'issue' &&\n event.type == 'change'\n key: 'TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n },\n { # TaskUpdated description\n check: (timeline, event) ->\n return event.obj == 'task' &&\n event.type == 'change' &&\n !timeline.getIn('data', 'task', 'userstory') &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'description_diff'\n key: 'TIMELINE.TASK_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n },\n { # TaskUpdated with US description\n check: (timeline, event) ->\n return event.obj == 'task' &&\n event.type == 'change' &&\n timeline.getIn('data', 'task', 'userstory') &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'description_diff'\n key: 'TIMELINE.TASK_UPDATED_WITH_US',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name']\n },\n { # TaskUpdated general\n check: (timeline, event) ->\n return event.obj == 'task' &&\n event.type == 'change' &&\n !timeline.getIn(['data', 'task', 'userstory'])\n key: 'TIMELINE.TASK_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n },\n { # TaskUpdated with US\n check: (timeline, event) ->\n return event.obj == 'task' &&\n event.type == 'change' &&\n timeline.getIn(['data', 'task', 'userstory'])\n key: 'TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name', 'new_value']\n },\n { # New User\n check: (timeline, event) ->\n return event.obj == 'user' && event.type == 'create'\n key: 'TIMELINE.NEW_USER',\n translate_params: ['username']\n }\n ]\n\n return _.find types, (obj) ->\n return obj.check(timeline, event)\n\nclass UserTimelineType\n getType: (timeline, event) -> timelineType(timeline, event)\n\nangular.module(\"taigaUserTimeline\")\n .service(\"tgUserTimelineItemType\", UserTimelineType)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-item.directive.coffee\n###\n\nUserTimelineItemDirective = () ->\n return {\n templateUrl: \"user-timeline/user-timeline-item/user-timeline-item.html\"\n scope: {\n timeline: \"=tgUserTimelineItem\"\n }\n }\n\nangular.module(\"taigaUserTimeline\")\n .directive(\"tgUserTimelineItem\", UserTimelineItemDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-pagination-sequence.service.coffee\n###\n\nUserTimelinePaginationSequence = () ->\n obj = {}\n\n obj.generate = (config) ->\n page = 1\n items = Immutable.List()\n\n config.minItems = config.minItems || 20\n\n next = () ->\n items = Immutable.List()\n return getContent()\n\n getContent = () ->\n config.fetch(page).then (response) ->\n page++\n\n data = response.get(\"data\")\n\n if config.filter\n data = config.filter(data)\n\n if config.map\n data = data.map(config.map)\n\n items = items.concat(data)\n\n if items.size < config.minItems && response.get(\"next\")\n return getContent()\n\n return Immutable.Map({\n items: items,\n next: response.get(\"next\")\n })\n\n return {\n next: () -> next()\n }\n\n return obj\n\nangular.module(\"taigaUserTimeline\").factory(\"tgUserTimelinePaginationSequenceService\", UserTimelinePaginationSequence)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/profile/profile-timeline/profile-timeline.controller.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\n\nclass UserTimelineController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"tgUserTimelineService\"\n ]\n\n constructor: (@userTimelineService) ->\n @.timelineList = Immutable.List()\n @.scrollDisabled = false\n\n @.timeline = null\n\n if @.projectId\n @.timeline = @userTimelineService.getProjectTimeline(@.projectId)\n else if @.currentUser\n @.timeline = @userTimelineService.getProfileTimeline(@.user.get(\"id\"))\n else\n @.timeline = @userTimelineService.getUserTimeline(@.user.get(\"id\"))\n\n loadTimeline: () ->\n @.scrollDisabled = true\n\n return @.timeline\n .next()\n .then (response) =>\n @.timelineList = @.timelineList.concat(response.get(\"items\"))\n\n if response.get(\"next\")\n @.scrollDisabled = false\n\n return @.timelineList\n\nangular.module(\"taigaUserTimeline\")\n .controller(\"UserTimeline\", UserTimelineController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline.directive.coffee\n###\n\nUserTimelineDirective = ->\n return {\n templateUrl: \"user-timeline/user-timeline/user-timeline.html\",\n controller: \"UserTimeline\",\n controllerAs: \"vm\",\n scope: {\n projectId: \"=projectid\",\n user: \"=\",\n currentUser: \"=\"\n },\n bindToController: true\n }\n\nangular.module(\"taigaProfile\").directive(\"tgUserTimeline\", UserTimelineDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline.service.coffee\n###\n\ntaiga = @.taiga\n\nclass UserTimelineService extends taiga.Service\n @.$inject = [\n \"tgResources\",\n \"tgUserTimelinePaginationSequenceService\",\n \"tgUserTimelineItemType\",\n \"tgUserTimelineItemTitle\"\n ]\n\n constructor: (@rs, @userTimelinePaginationSequenceService, @userTimelineItemType, @userTimelineItemTitle) ->\n\n _valid_fields: [\n 'status',\n 'subject',\n 'description_diff',\n 'assigned_to',\n 'points',\n 'severity',\n 'priority',\n 'type',\n 'attachments',\n 'is_iocaine',\n 'content_diff',\n 'name',\n 'estimated_finish',\n 'estimated_start',\n # customs\n 'blocked',\n 'moveInBacklog',\n 'milestone'\n ]\n\n _invalid: [\n {# Items with only invalid fields\n check: (timeline) ->\n value_diff = timeline.get(\"data\").get(\"value_diff\")\n\n if value_diff\n fieldKey = value_diff.get('key')\n\n if @._valid_fields.indexOf(fieldKey) == -1\n return true\n else if fieldKey == 'attachments' &&\n value_diff.get('value').get('new').size == 0\n return true\n\n return false\n },\n {# Deleted\n check: (timeline) ->\n event = timeline.get('event_type').split(\".\")\n return event[2] == 'delete'\n },\n {# Project change\n check: (timeline) ->\n event = timeline.get('event_type').split(\".\")\n return event[1] == 'project' && event[2] == 'change'\n },\n {# Comment deleted\n check: (timeline) ->\n return !!timeline.get(\"data\").get(\"comment_deleted\")\n },\n {# Task milestone\n check: (timeline) ->\n event = timeline.get('event_type').split(\".\")\n value_diff = timeline.get(\"data\").get(\"value_diff\")\n\n if value_diff &&\n event[1] == \"task\" &&\n event[2] == \"change\" &&\n value_diff.get(\"key\") == \"milestone\"\n return timeline.get(\"data\").get(\"value_diff\").get(\"value\")\n\n return false\n }\n ]\n\n _isInValidTimeline: (timeline) ->\n return _.some @._invalid, (invalid) =>\n return invalid.check.call(this, timeline)\n\n _parseEventType: (event_type) ->\n event_type = event_type.split(\".\")\n\n return {\n section: event_type[0],\n obj: event_type[1],\n type: event_type[2]\n }\n\n _getTimelineObject: (timeline, event) ->\n if timeline.get('data').get(event.obj)\n return timeline.get('data').get(event.obj)\n\n _attachExtraInfoToTimelineEntry: (timeline, event, type) ->\n title = @userTimelineItemTitle.getTitle(timeline, event, type)\n\n timeline = timeline.set('title_html', title)\n\n timeline = timeline.set('obj', @._getTimelineObject(timeline, event))\n\n if type.description\n timeline = timeline.set('description', type.description(timeline))\n\n if type.member\n timeline = timeline.set('member', type.member(timeline))\n\n if timeline.getIn(['data', 'value_diff', 'key']) == 'attachments' &&\n timeline.hasIn(['data', 'value_diff', 'value', 'new'])\n timeline = timeline.set('attachments', timeline.getIn(['data', 'value_diff', 'value', 'new']))\n\n return timeline\n\n # - create a entry per every item in the values_diff\n _parseTimeline: (response) ->\n newdata = Immutable.List()\n\n response.get('data').forEach (item) =>\n event = @._parseEventType(item.get('event_type'))\n\n data = item.get('data')\n values_diff = data.get('values_diff')\n\n if values_diff && values_diff.count()\n # blocked/unblocked change must be a single change\n if values_diff.has('is_blocked')\n values_diff = Immutable.Map({'blocked': values_diff})\n\n if values_diff.has('milestone')\n values_diff = Immutable.Map({'moveInBacklog': values_diff})\n else if event.obj == 'milestone'\n values_diff = Immutable.Map({'milestone': values_diff})\n\n values_diff.forEach (value, key) =>\n obj = Immutable.Map({\n key: key,\n value: value\n })\n\n newItem = item.setIn(['data', 'value_diff'], obj)\n newItem = newItem.deleteIn(['data', 'values_diff'])\n newdata = newdata.push(newItem)\n else\n newItem = item.deleteIn(['data', 'values_diff'])\n newdata = newdata.push(newItem)\n\n return response.set('data', newdata)\n\n _addEntyAttributes: (item) ->\n event = @._parseEventType(item.get('event_type'))\n type = @userTimelineItemType.getType(item, event)\n\n return @._attachExtraInfoToTimelineEntry(item, event, type)\n\n getProfileTimeline: (userId) ->\n config = {}\n\n config.fetch = (page) =>\n return @rs.users.getProfileTimeline(userId, page)\n .then (response) =>\n return @._parseTimeline(response)\n\n config.map = (obj) => @._addEntyAttributes(obj)\n\n config.filter = (items) =>\n return items.filterNot (item) => @._isInValidTimeline(item)\n\n return @userTimelinePaginationSequenceService.generate(config)\n\n getUserTimeline: (userId) ->\n config = {}\n\n config.fetch = (page) =>\n return @rs.users.getUserTimeline(userId, page)\n .then (response) =>\n return @._parseTimeline(response)\n\n config.map = (obj) => @._addEntyAttributes(obj)\n\n config.filter = (items) =>\n return items.filterNot (item) => @._isInValidTimeline(item)\n\n return @userTimelinePaginationSequenceService.generate(config)\n\n getProjectTimeline: (projectId) ->\n config = {}\n\n config.fetch = (page) =>\n return @rs.projects.getTimeline(projectId, page)\n .then (response) => return @._parseTimeline(response)\n\n config.map = (obj) => @._addEntyAttributes(obj)\n\n config.filter = (items) =>\n return items.filterNot (item) => @._isInValidTimeline(item)\n\n return @userTimelinePaginationSequenceService.generate(config)\n\nangular.module(\"taigaUserTimeline\").service(\"tgUserTimelineService\", UserTimelineService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog.coffee\n###\n\nmodule = angular.module(\"taigaPlugins\", [\"ngRoute\"])\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["coffee/app.coffee","coffee/classes.coffee","coffee/utils.coffee","coffee/modules/controllerMixins.coffee","coffee/modules/admin.coffee","coffee/modules/auth.coffee","coffee/modules/backlog.coffee","coffee/modules/base.coffee","coffee/modules/common.coffee","coffee/modules/events.coffee","coffee/modules/feedback.coffee","coffee/modules/integrations.coffee","coffee/modules/issues.coffee","coffee/modules/kanban.coffee","coffee/modules/projects.coffee","coffee/modules/related-tasks.coffee","coffee/modules/resources.coffee","coffee/modules/search.coffee","coffee/modules/taskboard.coffee","coffee/modules/tasks.coffee","coffee/modules/team.coffee","coffee/modules/user-settings.coffee","coffee/modules/userstories.coffee","coffee/modules/wiki.coffee","coffee/modules/common/analytics.coffee","coffee/modules/common/attachments.coffee","coffee/modules/common/bind-scope.coffee","coffee/modules/common/compile-html.directive.coffee","coffee/modules/common/components.coffee","coffee/modules/common/confirm.coffee","coffee/modules/common/custom-field-values.coffee","coffee/modules/common/estimation.coffee","coffee/modules/common/filters.coffee","coffee/modules/common/history.coffee","coffee/modules/common/importer.coffee","coffee/modules/common/lightboxes.coffee","coffee/modules/common/loader.coffee","coffee/modules/common/loading.coffee","coffee/modules/common/popovers.coffee","coffee/modules/common/raven-logger.coffee","coffee/modules/common/tags.coffee","coffee/modules/common/wisiwyg.coffee","coffee/modules/backlog/filters.coffee","coffee/modules/backlog/lightboxes.coffee","coffee/modules/backlog/main.coffee","coffee/modules/backlog/sortable.coffee","coffee/modules/backlog/sprints.coffee","coffee/modules/taskboard/charts.coffee","coffee/modules/taskboard/lightboxes.coffee","coffee/modules/taskboard/main.coffee","coffee/modules/taskboard/sortable.coffee","coffee/modules/kanban/main.coffee","coffee/modules/kanban/sortable.coffee","coffee/modules/issues/detail.coffee","coffee/modules/issues/lightboxes.coffee","coffee/modules/issues/list.coffee","coffee/modules/userstories/detail.coffee","coffee/modules/tasks/detail.coffee","coffee/modules/team/main.coffee","coffee/modules/wiki/main.coffee","coffee/modules/wiki/nav.coffee","coffee/modules/admin/lightboxes.coffee","coffee/modules/admin/memberships.coffee","coffee/modules/admin/nav.coffee","coffee/modules/admin/project-profile.coffee","coffee/modules/admin/project-values.coffee","coffee/modules/admin/roles.coffee","coffee/modules/admin/third-parties.coffee","coffee/modules/projects/lightboxes.coffee","coffee/modules/base/bind.coffee","coffee/modules/base/conf.coffee","coffee/modules/base/contrib.coffee","coffee/modules/base/filters.coffee","coffee/modules/base/http.coffee","coffee/modules/base/location.coffee","coffee/modules/base/model.coffee","coffee/modules/base/navurls.coffee","coffee/modules/base/repository.coffee","coffee/modules/base/storage.coffee","coffee/modules/base/urls.coffee","coffee/modules/resources/attachments.coffee","coffee/modules/resources/custom-attributes-values.coffee","coffee/modules/resources/custom-attributes.coffee","coffee/modules/resources/history.coffee","coffee/modules/resources/invitations.coffee","coffee/modules/resources/issues.coffee","coffee/modules/resources/kanban.coffee","coffee/modules/resources/locales.coffee","coffee/modules/resources/mdrender.coffee","coffee/modules/resources/memberships.coffee","coffee/modules/resources/modules.coffee","coffee/modules/resources/notify-policies.coffee","coffee/modules/resources/projects.coffee","coffee/modules/resources/roles.coffee","coffee/modules/resources/search.coffee","coffee/modules/resources/sprints.coffee","coffee/modules/resources/tasks.coffee","coffee/modules/resources/user-settings.coffee","coffee/modules/resources/users.coffee","coffee/modules/resources/userstories.coffee","coffee/modules/resources/webhooklogs.coffee","coffee/modules/resources/webhooks.coffee","coffee/modules/resources/wiki.coffee","coffee/modules/user-settings/change-password.coffee","coffee/modules/user-settings/lightboxes.coffee","coffee/modules/user-settings/main.coffee","coffee/modules/user-settings/nav.coffee","coffee/modules/user-settings/notifications.coffee","modules/components/components.module.coffee","modules/external-apps/external-apps.module.coffee","modules/home/home.module.coffee","modules/navigation-bar/navigation-bar.module.coffee","modules/profile/profile.module.coffee","modules/projects/projects.module.coffee","modules/resources/resources.module.coffee","modules/user-timeline/user-timeline.module.coffee","modules/components/joy-ride/joy-ride.directive.coffee","modules/components/joy-ride/joy-ride.service.coffee","modules/components/project-menu/project-menu.controller.coffee","modules/components/project-menu/project-menu.directive.coffee","modules/components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.directive.coffee","modules/components/vote-button/vote-button.controller.coffee","modules/components/vote-button/vote-button.directive.coffee","modules/components/watch-button/watch-button.controller.coffee","modules/components/watch-button/watch-button.directive.coffee","modules/external-apps/external-app.controller.coffee","modules/external-apps/external-app.service.coffee","modules/feedback/feedback.service.coffee","modules/home/duties/duty.directive.coffee","modules/home/home.service.coffee","modules/home/projects/home-project-list.directive.coffee","modules/home/working-on/working-on.controller.coffee","modules/home/working-on/working-on.directive.coffee","modules/navigation-bar/dropdown-project-list/dropdown-project-list.directive.coffee","modules/navigation-bar/dropdown-user/dropdown-user.directive.coffee","modules/navigation-bar/navigation-bar.directive.coffee","modules/navigation-bar/navigation-bar.service.coffee","modules/profile/profile-bar/profile-bar.controller.coffee","modules/profile/profile-bar/profile-bar.directive.coffee","modules/profile/profile-contacts/profile-contacts.controller.coffee","modules/profile/profile-contacts/profile-contacts.directive.coffee","modules/profile/profile-favs/items/items.directive.coffee","modules/profile/profile-favs/profile-favs.controller.coffee","modules/profile/profile-favs/profile-favs.directive.coffee","modules/profile/profile-hints/profile-hints.controller.coffee","modules/profile/profile-hints/profile-hints.directive.coffee","modules/profile/profile-projects/profile-projects.controller.coffee","modules/profile/profile-projects/profile-projects.directive.coffee","modules/profile/profile-tab/profile-tab.directive.coffee","modules/profile/profile-tabs/profile-tabs.controller.coffee","modules/profile/profile-tabs/profile-tabs.directive.coffee","modules/profile/profile.controller.coffee","modules/projects/components/like-project-button/like-project-button.controller.coffee","modules/projects/components/like-project-button/like-project-button.directive.coffee","modules/projects/components/like-project-button/like-project-button.service.coffee","modules/projects/components/sort-projects.directive.coffee","modules/projects/components/watch-project-button/watch-project-button.controller.coffee","modules/projects/components/watch-project-button/watch-project-button.directive.coffee","modules/projects/components/watch-project-button/watch-project-button.service.coffee","modules/projects/listing/projects-listing.controller.coffee","modules/projects/project/project.controller.coffee","modules/projects/projects.service.coffee","modules/resources/external-apps-resource.service.coffee","modules/resources/issues-resource.service.coffee","modules/resources/projects-resource.service.coffee","modules/resources/resources.coffee","modules/resources/tasks-resource.service.coffee","modules/resources/user-resource.service.coffee","modules/resources/users-resource.service.coffee","modules/resources/userstories-resource.service.coffee","modules/services/app-meta.service.coffee","modules/services/check-permissions.service.coffee","modules/services/current-user.service.coffee","modules/services/lightbox-factory.service.coffee","modules/services/paginate-response.service.coffee","modules/services/project.service.coffee","modules/services/scope-event.service.coffee","modules/services/theme.service.coffee","modules/services/user.service.coffee","modules/services/xhrError.service.coffee","modules/user-timeline/user-timeline-attachment/user-timeline-attachment.directive.coffee","modules/user-timeline/user-timeline-item/user-timeline-item-title.service.coffee","modules/user-timeline/user-timeline-item/user-timeline-item-type.service.coffee","modules/user-timeline/user-timeline-item/user-timeline-item.directive.coffee","modules/user-timeline/user-timeline-pagination-sequence/user-timeline-pagination-sequence.service.coffee","modules/user-timeline/user-timeline/user-timeline.controller.coffee","modules/user-timeline/user-timeline/user-timeline.directive.coffee","modules/user-timeline/user-timeline/user-timeline.service.coffee","plugins/main.coffee"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACniBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACldA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACn2CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5qBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvIA;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA,kOAAA;IAAA;;;;EAqBA,KAAA,GAAQ,IAAC,CAAC;;EAEV,KAAA,GAAQ,IAAC,CAAC,KAAK,CAAC;;EAChB,IAAA,GAAO,IAAC,CAAC,KAAK,CAAC;;EACf,QAAA,GAAW,IAAC,CAAC,KAAK,CAAC;;EACnB,OAAA,GAAU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,GAA2B;YAC3B,KAAK,CAAC,IAAN,CAAW,YAAX;mBACA,WAAA,CAAY,YAAZ,EAHJ;;QAD4B;MAAA,CAAA,CAAA,CAAA,IAAA,CAAhC;MAMA,MAAM,CAAC,MAAP,CAAc,MAAM,CAAC,8BAArB,EAAqD,CAAA,SAAA,KAAA;eAAA,SAAC,GAAD;iBACjD,WAAA,CAAY,GAAZ;QADiD;MAAA,CAAA,CAAA,CAAA,IAAA,CAArD;aAGA,MAAM,CAAC,GAAP,CAAW,UAAX,EAAuB,SAAA;eACnB,GAAG,CAAC,GAAJ,CAAA;MADmB,CAAvB;IAjCG;AAoCP,WAAO;MAAC,IAAA,EAAM,IAAP;;EA1C6B;;EA4CxC,MAAM,CAAC,SAAP,CAAiB,gCAAjB,EAAmD,CAAC,SAAD,EAAY,YAAZ,EACC,qCADD,CAAnD;AAlzBA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpRA;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnFA;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAsBA,KAAA,GAAQ,IAAC,CAAC;;EACV,UAAA,GAAa,IAAC,CAAC,KAAK,CAAC;;EAGrB,gBAAA,GAAmB,SAAC,UAAD,EAAa,OAAb,EAAsB,KAAtB,EAA6B,MAA7B,EAAqC,KAArC,EAA4C,KAA5C,EAAmD,EAAnD;AACf,QAAA;IAAA,OAAA,GAAU;IAEV,OAAO,CAAC,IAAR,GAAe,SAAC,OAAD,EAAU,QAAV,EAAoB,SAApB;AACX,UAAA;MAAA,MAAA,GAAS;QAAC,SAAA,EAAW,QAAZ;QAAsB,OAAA,EAAS,SAA/B;;AACT,aAAO,KAAK,CAAC,SAAN,CAAgB,OAAhB,EAAyB,MAAzB;IAFI;IAIf,OAAO,CAAC,MAAR,GAAiB,SAAC,OAAD,EAAU,SAAV,EAAqB,QAArB,EAA+B,IAA/B;AACb,UAAA;MAAA,OAAA,GAAU,EAAE,CAAC,KAAH,CAAA;MAEV,IAAG,IAAA,KAAQ,MAAX;QACI,OAAO,CAAC,MAAR,CAAe,IAAf;AACA,eAAO,OAAO,CAAC,QAFnB;;MAIA,WAAA,GAAc,O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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAsBA,KAAA,GAAQ,IAAC,CAAC;;EAEV,gBAAA,GAAmB,SAAC,KAAD,EAAQ,KAAR,EAAe,KAAf;AACf,QAAA;IAAA,OAAA,GAAU;IAEV,OAAO,CAAC,MAAR,GAAiB,SAAC,SAAD,EAAY,OAAZ;AAEb,UAAA;MAAA,IAAqB,iBAAJ,IAAgB,OAAA,KAAW,EAA5C;QAAA,OAAA,GAAU,IAAV;;MAEA,MAAA,GAAS;QACL,UAAA,EAAY,SADP;QAEL,OAAA,EAAS,OAFJ;;MAIT,GAAA,GAAM,KAAK,CAAC,OAAN,CAAc,MAAd;AACN,aAAO,KAAK,CAAC,IAAN,CAAc,GAAD,GAAK,SAAlB,EAA4B,MAA5B,CAAmC,CAAC,IAApC,CAAyC,CAAA,SAAA,KAAA;eAAA,SAAC,IAAD;AAC5C,iBAAO,IAAI,CAAC;QADgC;MAAA,CAAA,CAAA,CAAA,IAAA,CAAzC;IATM;AAYjB,WAAO,SAAC,QAAD;aACH,QAAQ,CAAC,QAAT,GAAoB;IADjB;EAfQ;;EAmBnB,MAAA,GAAS,OAAO,CAAC,MAAR,CAAe,gBAAf;;EACT,MAAM,CAAC,OAAP,CAAe,8BAAf,EAA+C,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,gBAAlC,CAA/C;AA5CA;;;;ACAA;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAsBA,KAAA,GAAQ,IAAC,CAAC;;EAEV,gBAAA,GAAmB,SAAC,KAAD,EAAQ,KAAR,EAAe,KAAf;AACf,QAAA;IAAA,OAAA,GAAU;IAEV,OAAO,CAAC,GAAR,GAAc,SAAC,EAAD;AACV,aAAO,KAAK,CAAC,QAAN,CAAe,aAAf,EAA8B,EAA9B;IADG;IAGd,OAAO,CAAC,IAAR,GAAe,SAAC,SAAD,EAAY,OAAZ,EAAqB,gBAArB;AACX,UAAA;;QADgC,mBAAiB;;MACjD,MAAA,GAAS;QAAC,OAAA,EAAS,SAAV;;MACT,MAAA,GAAS,CAAC,CAAC,MAAF,CAAS,EAAT,EAAa,MAAb,EAAqB,OAAA,IAAW,EAAhC;MACT,IAAG,gBAAH;AACI,eAAO,KAAK,CAAC,cAAN,CAAqB,aAArB,EAAoC,MAApC,EADX;;AAGA,aAAO,KAAK,CAAC,SAAN,CAAgB,aAAhB,EAA+B,MAA/B,EAAuC,OAAA,GAAQ;QAAC,gBAAA,EAAiB,gBAAlB;OAA/C;IANI;IAQf,OAAO,CAAC,UAAR,GAAqB,SAAC,MAAD,EAAS,OAAT;AACjB,UAAA;MAAA,MAAA,GAAS;QAAC,IAAA,EAAM,MAAP;;MACT,MAAA,GAAS,CAAC,CAAC,MAAF,CAAS,EAAT,EAAa,MAAb,EAAqB,OAAA,IAAW,EAAhC;AACT,aAAO,KAAK,CAAC,cAAN,CAAqB,aAArB,EAAoC,MAApC;IAHU;IAKrB,OAAO,CAAC,gBAAR,GAA2B,SAAC,EAAD;AACvB,UAAA;MAAA,GAAA,GAAM,KAAK,CAAC,OAAN,CAAc,aAAd;AACN,aAAO,KAAK,CAAC,IAAN,CAAc,GAAD,GAAK,GAAL,GAAQ,EAAR,GAAW,oBAAxB,EAA6C,EAA7C;IAFgB;IAI3B,OAAO,CAAC,qBAAR,GAAgC,SAAC,SAAD,EAAY,IAAZ,EAAkB,qBAAlB;AAC5B,UAAA;MAAA,GAAA,GAAM,KAAK,CAAC,OAAN,CAAc,yBAAd;MACN,MAAA,GAAS;QAAC,UAAA,EAAY,SAAb;QAAwB,gBAAA,EAAkB,IAA1C;QAAgD,qBAAA,EAAuB,qBAAvE;;AACT,aAAO,KAAK,CAAC,IAAN,CAAW,GAAX,EAAgB,MAAhB;IAHqB;AAKhC,WAAO,SAAC,QAAD;aACH,QAAQ,CAAC,WAAT,GAAuB;IADpB;EA5BQ;;EAgCnB,MAAA,GAAS,OAAO,CAAC,MAAR,CAAe,gBAAf;;EACT,MAAM,CAAC,OAAP,CAAe,iCAAf,EAAkD,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,gBAAlC,CAAlD;AAzDA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxIA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAmBA,KAAA,GAAQ,IAAC,CAAC;;EAEV,oBAAA,GAAuB,SAAC,cAAD,EAAiB,eAAjB;AACnB,QAAA;IAAA,IAAA,GAAO,SAAC,KAAD,EAAQ,EAAR,EAAY,KAAZ,EAAmB,IAAnB;AACH,UAAA;MAAA,aAAA,GAAgB,SAAA;QACZ,IAAG,cAAc,CAAC,OAAlB;iBACI,IAAI,CAAC,IAAL,CAAA,EADJ;SAAA,MAAA;iBAGI,IAAI,CAAC,IAAL,CAAA,EAHJ;;MADY;aAMhB,KAAK,CAAC,MAAN,CAAa,CAAE,SAAA;AACX,eAAO,cAAc,CAAC;MADX,CAAF,CAAb,EAEG,aAFH;IAPG;AAWP,WAAO;MACH,KAAA,EAAO,EADJ;MAEH,UAAA,EAAY,aAFT;MAGH,YAAA,EAAc,IAHX;MAIH,WAAA,EAAa,2CAJV;MAKH,IAAA,EAAM,IALH;;EAZY;;EAoBvB,oBAAoB,CAAC,OAArB,GAA+B,CAC3B,kBAD2B,EAE3B,mBAF2B;;EAK/B,OAAO,CAAC,MAAR,CAAe,iBAAf,CAAiC,CAAC,SAAlC,CAA4C,eAA5C,EAA6D,oBAA7D;AA9CA;;;;ACAA;;;;;;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jC;UACjB,cAAA,GAAiB,cAAc,CAAC,GAAf,CAAmB,UAAnB,EAA+B,QAA/B;UAEjB,cAAA,GAAiB,KAAC,CAAC,kCAAF,CAAqC,cAArC,EAAqD,YAArD;AAEjB,iBAAO;QANH;MAAA,CAAA,CAAA,CAAA,IAAA,CARR;IAlDe;;;;KAvEG,KAAK,CAAC;;EAyIhC,OAAO,CAAC,MAAR,CAAe,WAAf,CAA2B,CAAC,OAA5B,CAAoC,eAApC,EAAqD,WAArD;AA9JA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAmBA,kBAAA,GAAqB,SAAC,WAAD,EAAc,kBAAd;AACjB,QAAA;IAAA,IAAA,GAAO,SAAC,KAAD,EAAQ,EAAR,EAAY,KAAZ,EAAmB,IAAnB;AACH,UAAA;MAAA,IAAA,GAAO,kBAAkB,CAAC,OAAnB,CAAA;MAEP,IAAG,IAAH;QACE,MAAA,GAAS,IAAI,CAAC,GAAL,CAAS,IAAT;eACT,IAAI,CAAC,iBAAL,CAAuB,MAAvB,EAFF;;IAHG;AAOP,WAAO;MACH,UAAA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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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C,wBADlC;AAxLA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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Af,CAA+B,CAAC,OAAhC,CAAwC,4BAAxC,EAAsE,wBAAtE;AAtEA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA,gCAAA;IAAA;;;EAmBA,KAAA,GAAQ,IAAC,CAAC;;EAEJ;;;IACF,yBAAC,CAAC,OAAF,GAAY,CACR,aADQ,EAER,sBAFQ,EAGR,kBAHQ;;IAMC,mCAAC,EAAD,EAAM,kBAAN,EAA2B,cAA3B;MAAC,IAAC,CAAA,KAAD;MAAK,IAAC,CAAA,qBAAD;MAAqB,IAAC,CAAA,iBAAD;IAA3B;;wCAEb,gBAAA,GAAkB,SAAC,SAAD;AACd,aAAO,IAAC,CAAA,kBAAkB,CAAC,QACnB,CAAC,GADF,CACM,KADN,CAEC,CAAC,SAFF,CAEY,SAAC,OAAD;eAAa,OAAO,CAAC,GAAR,CAAY,IAAZ,CAAA,KAAqB;MAAlC,CAFZ;IADO;;wCAMlB,eAAA,GAAiB,SAAC,SAAD,EAAY,WAAZ,EAAyB,SAAzB;AACb,UAAA;MAAA,YAAA,GAAe,IAAC,CAAC,gBAAF,CAAmB,SAAnB;MAEf,QAAA,GAAW,IAAC,CAAA,kBAAkB,CAAC,QAC3B,CAAC,GADM,CACF,KADE,CAEP,CAAC,MAFM,CAEC,YAFD,EAEe,CAAA,SAAA,KAAA;eAAA,SAAC,OAAD;AAClB,cAAA;UAAA,aAAA,GAAgB,OAAO,CAAC,GAAR,CAAY,gBAAZ;UAEhB,IAAG,SAAH;YAAkB,aAAA,GAAlB;WAAA,MAAA;YAAuC,aAAA,GAAvC;;AAEA,iBAAO,OAAO,CAAC,KAAR,CAAc;YACjB,UAAA,EAAY,SADK;YAEjB,cAAA,EAAgB,aAFC;YAGjB,YAAA,EAAc,WAHG;WAAd;QALW;MAAA,CAAA,CAAA,CAAA,IAAA,CAFf;aAaX,IAAC,CAAA,kBAAkB,CAAC,WAApB,CAAgC,QAAhC;IAhBa;;wCAkBjB,qBAAA,GAAuB,SAAC,WAAD,EAAc,SAAd;AACnB,UAAA;MAAA,aAAA,GAAgB,IAAC,CAAA,cAAc,CAAC,OAAO,CAAC,GAAxB,CAA4B,gBAA5B;MAEhB,IAAG,SAAH;QAAkB,aAAA,GAAlB;OAAA,MAAA;QAAuC,aAAA,GAAvC;;MAEA,OAAA,GAAU,IAAC,CAAA,cAAc,CAAC,OAAO,CAAC,KAAxB,CAA8B;QACpC,UAAA,EAAY,SADwB;QAEpC,cAAA,EAAgB,aAFoB;QAGpC,YAAA,EAAc,WAHsB;OAA9B;aAMV,IAAC,CAAA,cAAc,CAAC,UAAhB,CAA2B,OAA3B;IAXmB;;wCAavB,KAAA,GAAO,SAAC,SAAD,EAAY,WAAZ;AACH,aAAO,IAAC,CAAA,EAAE,CAAC,QAAQ,CAAC,YAAb,CAA0B,SAA1B,EAAqC,WAArC,CAAiD,CAAC,IAAlD,CAAuD,CAAA,SAAA,KAAA;eAAA,SAAA;UAC1D,KAAC,CAAC,eAAF,CAAkB,SAAlB,EAA6B,WAA7B,EAA0C,IAA1C;iBACA,KAAC,CAAC,qBAAF,CAAwB,WAAxB,EAAqC,IAArC;QAF0D;MAAA,CAAA,CAAA,CAAA,IAAA,CAAvD;IADJ;;wCAKP,OAAA,GAAS,SAAC,SAAD;AACL,aAAO,IAAC,CAAA,EAAE,CAAC,QAAQ,CAAC,cAAb,CAA4B,SAA5B,CAAsC,CAAC,IAAvC,CAA4C,CAAA,SAAA,KAAA;eAAA,SAAA;UAC/C,KAAC,CAAC,eAAF,CAAkB,SAAlB,EAA6B,IAA7B,EAAmC,KAAnC;iBACA,KAAC,CAAC,qBAAF,CAAwB,IAAxB,EAA8B,KAA9B;QAF+C;MAAA,CAAA,CAAA,CAAA,IAAA,CAA5C;IADF;;;;KAnD2B,KAAK,CAAC;;EAwD9C,OAAO,CAAC,MAAR,CAAe,eAAf,CAA+B,CAAC,OAAhC,CAAwC,6BAAxC,EAAuE,yBAAvE;AA7EA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAmBA,UAAA,GAAa,SAAA,GAAA;;EAEb,QAAA,GAAW,SAAC,WAAD,EAAc,IAAd,EAAoB,uBAApB;AACP,QAAA;IAAA,OAAA,GAAU;IAEV,OAAO,CAAC,gBAAR,GAA2B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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAmBA,QAAA,GAAW,SAAC,WAAD,EAAc,IAAd,EAAoB,uBAApB;AACP,QAAA;IAAA,OAAA,GAAU;IAEV,OAAO,CAAC,iBAAR,GAA4B,SAAC,QAAD;AACxB,UAAA;MAAA,GAAA,GAAM,WAAW,CAAC,OAAZ,CAAoB,aAApB;MAEN,WAAA,GAAc;QACV,OAAA,EAAS;UACL,sBAAA,EAAwB,GADnB;SADC;;MAMd,MAAA,GAAS;QACL,QAAA,EAAU,QADL;;AAIT,aAAO,IAAI,CAAC,GAAL,CAAS,GAAT,EAAc,MAAd,EAAsB,WAAtB,CACH,CAAC,IADE,CACG,SAAC,MAAD;AACF,eAAO,SAAS,CAAC,MAAV,CAAiB,MAAM,CAAC,IAAxB;MADL,CADH;IAbiB;IAiB5B,OAAO,CAAC,QAAR,GAAmB,SAAC,MAAD;AACf,UAAA;MAAA,GAAA,GAAM,WAAW,CA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AAD,GAAK,GAAL,GAAQ;AAEhB,aAAO,IAAI,CAAC,GAAL,CAAS,GAAT,EAAc,MAAd,CAAqB,CAAC,IAAtB,CAA2B,SAAC,MAAD;QAC9B,MAAA,GAAS,SAAS,CAAC,MAAV,CAAiB,MAAjB;AACT,eAAO,uBAAA,CAAwB,MAAxB;MAFuB,CAA3B;IARe;AAY1B,WAAO,SAAA;AACH,aAAO;QAAC,OAAA,EAAS,OAAV;;IADJ;EA7GA;;EAgHX,QAAQ,CAAC,OAAT,GAAmB,CAAC,SAAD,EAAY,SAAZ,EAAuB,2BAAvB;;EAEnB,MAAA,GAAS,OAAO,CAAC,MAAR,CAAe,iBAAf;;EACT,MAAM,CAAC,OAAP,CAAe,kBAAf,EAAmC,QAAnC;AAtIA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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,OAAb;QAAb;MAAA,CAAA,CAAA,CAAA,IAAA,CAA9C;IAHG;;;;;;EAKlB,OAAO,CAAC,MAAR,CAAe,aAAf,CAA6B,CAAC,OAA9B,CAAsC,kBAAtC,EAA0D,cAA1D;AA1EA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;;;;;;;;;;;;;;;;;;;AAAA;AAAA,MAAA;;EAmBA,SAAA,GAAY,IAAC,CAAC,KAAK,CAAC;;EAEd;IACF,qBAAC,CAAC,OAAF,GAAY,CACR,YADQ;;oCAIZ,oBAAA,GAAsB;MAClB,QAAA,EAAU,sBADQ;MAElB,SAAA,EAAW,uBAFO;MAGlB,kBAAA,EAAoB,2BAHF;MAIlB,QAAA,EAAU,sBAJQ;MAKlB,aAAA,EAAe,2BALG;MAMlB,UAAA,EAAY,wBANM;MAOlB,UAAA,EAAY,wBAPM;MAQlB,MAAA,EAAQ,oBARU;MASlB,YAAA,EAAc,wBATI;MAUlB,YAAA,EAAc,0BAVI;;;oCAatB,OAAA,GAAS;MACL,QAAA,EAAU,SAAC,QAAD,EAAW,KAAX;AACN,YAAA;QAAA,IAAA,GAAO,QAAQ,CAAC,KAAT,CAAe,CAAC,MAAD,EAAS,MAAT,CAAf;QAEP,IAAG,IAAI,CAAC,GAAL,CAAS,oBAAT,CAAH;UACI,UAAA,GAAa,IAAC,CAAA,SAAS,CAA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AX;aAAqB,YAAA,CAAa,QAAb,EAAuB,KAAvB;IAArB;;;;;;EAEb,OAAO,CAAC,MAAR,CAAe,mBAAf,CACI,CAAC,OADL,CACa,wBADb,EACuC,gBADvC;AA3QA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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","file":"app.js","sourcesContent":["###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: app.coffee\n###\n\n@taiga = taiga = {}\n@.taigaContribPlugins = @.taigaContribPlugins or []\n\n# Generic function for generate hash from a arbitrary length\n# collection of parameters.\ntaiga.generateHash = (components=[]) ->\n components = _.map(components, (x) -> JSON.stringify(x))\n return hex_sha1(components.join(\":\"))\n\n\ntaiga.generateUniqueSessionIdentifier = ->\n date = (new Date()).getTime()\n randomNumber = Math.floor(Math.random() * 0x9000000)\n return taiga.generateHash([date, randomNumber])\n\n\ntaiga.sessionId = taiga.generateUniqueSessionIdentifier()\n\n\nconfigure = ($routeProvider, $locationProvider, $httpProvider, $provide, $tgEventsProvider,\n $compileProvider, $translateProvider, $animateProvider) ->\n\n $animateProvider.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/)\n\n # wait until the trasnlation is ready to resolve the page\n originalWhen = $routeProvider.when\n\n $routeProvider.when = (path, route) ->\n route.resolve || (route.resolve = {})\n angular.extend(route.resolve, {\n languageLoad: [\"$q\", \"$translate\", ($q, $translate) ->\n deferred = $q.defer()\n\n $translate().then () -> deferred.resolve()\n\n return deferred.promise\n ]\n })\n\n return originalWhen.call($routeProvider, path, route)\n\n $routeProvider.when(\"/\",\n {\n templateUrl: \"home/home.html\",\n access: {\n requiresLogin: true\n },\n loader: true,\n title: \"HOME.PAGE_TITLE\",\n loader: true,\n description: \"HOME.PAGE_DESCRIPTION\",\n joyride: \"dashboard\"\n }\n )\n\n $routeProvider.when(\"/projects/\",\n {\n templateUrl: \"projects/listing/projects-listing.html\",\n access: {\n requiresLogin: true\n },\n title: \"PROJECTS.PAGE_TITLE\",\n description: \"PROJECTS.PAGE_DESCRIPTION\",\n loader: true,\n controller: \"ProjectsListing\",\n controllerAs: \"vm\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/\",\n {\n templateUrl: \"projects/project/project.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\"\n section: \"project-timeline\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/search\",\n {\n templateUrl: \"search/search.html\",\n reloadOnSearch: false,\n section: \"search\",\n loader: true\n }\n )\n\n $routeProvider.when(\"/project/:pslug/backlog\",\n {\n templateUrl: \"backlog/backlog.html\",\n loader: true,\n section: \"backlog\",\n joyride: \"backlog\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/kanban\",\n {\n templateUrl: \"kanban/kanban.html\",\n loader: true,\n section: \"kanban\",\n joyride: \"kanban\"\n }\n )\n\n # Milestone\n $routeProvider.when(\"/project/:pslug/taskboard/:sslug\",\n {\n templateUrl: \"taskboard/taskboard.html\",\n loader: true,\n section: \"backlog\"\n }\n )\n\n # User stories\n $routeProvider.when(\"/project/:pslug/us/:usref\",\n {\n templateUrl: \"us/us-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n }\n )\n\n # Tasks\n $routeProvider.when(\"/project/:pslug/task/:taskref\",\n {\n templateUrl: \"task/task-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n }\n )\n\n # Wiki\n $routeProvider.when(\"/project/:pslug/wiki\",\n {redirectTo: (params) -> \"/project/#{params.pslug}/wiki/home\"}, )\n $routeProvider.when(\"/project/:pslug/wiki/:slug\",\n {\n templateUrl: \"wiki/wiki.html\",\n loader: true,\n section: \"wiki\"\n }\n )\n\n # Team\n $routeProvider.when(\"/project/:pslug/team\",\n {\n templateUrl: \"team/team.html\",\n loader: true,\n section: \"team\"\n }\n )\n\n # Issues\n $routeProvider.when(\"/project/:pslug/issues\",\n {\n templateUrl: \"issue/issues.html\",\n loader: true,\n section: \"issues\"\n }\n )\n $routeProvider.when(\"/project/:pslug/issue/:issueref\",\n {\n templateUrl: \"issue/issues-detail.html\",\n loader: true,\n section: \"issues\"\n }\n )\n\n # Admin - Project Profile\n $routeProvider.when(\"/project/:pslug/admin/project-profile/details\",\n {\n templateUrl: \"admin/admin-project-profile.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-profile/default-values\",\n {\n templateUrl: \"admin/admin-project-default-values.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-profile/modules\",\n {\n templateUrl: \"admin/admin-project-modules.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-profile/export\",\n {\n templateUrl: \"admin/admin-project-export.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-profile/reports\",\n {\n templateUrl: \"admin/admin-project-reports.html\",\n section: \"admin\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/admin/project-values/status\",\n {\n templateUrl: \"admin/admin-project-values-status.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/points\",\n {\n templateUrl: \"admin/admin-project-values-points.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/priorities\",\n {\n templateUrl: \"admin/admin-project-values-priorities.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/severities\",\n {\n templateUrl: \"admin/admin-project-values-severities.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/types\",\n {\n templateUrl: \"admin/admin-project-values-types.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/project-values/custom-fields\",\n {\n templateUrl: \"admin/admin-project-values-custom-fields.html\",\n section: \"admin\"\n }\n )\n\n $routeProvider.when(\"/project/:pslug/admin/memberships\",\n {\n templateUrl: \"admin/admin-memberships.html\",\n section: \"admin\"\n }\n )\n # Admin - Roles\n $routeProvider.when(\"/project/:pslug/admin/roles\",\n {\n templateUrl: \"admin/admin-roles.html\",\n section: \"admin\"\n }\n )\n\n # Admin - Third Parties\n $routeProvider.when(\"/project/:pslug/admin/third-parties/webhooks\",\n {\n templateUrl: \"admin/admin-third-parties-webhooks.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/third-parties/github\",\n {\n templateUrl: \"admin/admin-third-parties-github.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/third-parties/gitlab\",\n {\n templateUrl: \"admin/admin-third-parties-gitlab.html\",\n section: \"admin\"\n }\n )\n $routeProvider.when(\"/project/:pslug/admin/third-parties/bitbucket\",\n {\n templateUrl: \"admin/admin-third-parties-bitbucket.html\",\n section: \"admin\"\n }\n )\n # Admin - Contrib Plugins\n $routeProvider.when(\"/project/:pslug/admin/contrib/:plugin\",\n {templateUrl: \"contrib/main.html\"})\n\n # User settings\n $routeProvider.when(\"/user-settings/user-profile\",\n {templateUrl: \"user/user-profile.html\"})\n $routeProvider.when(\"/user-settings/user-change-password\",\n {templateUrl: \"user/user-change-password.html\"})\n $routeProvider.when(\"/user-settings/mail-notifications\",\n {templateUrl: \"user/mail-notifications.html\"})\n $routeProvider.when(\"/change-email/:email_token\",\n {templateUrl: \"user/change-email.html\"})\n $routeProvider.when(\"/cancel-account/:cancel_token\",\n {templateUrl: \"user/cancel-account.html\"})\n\n # User profile\n $routeProvider.when(\"/profile\",\n {\n templateUrl: \"profile/profile.html\",\n loader: true,\n access: {\n requiresLogin: true\n },\n controller: \"Profile\",\n controllerAs: \"vm\"\n }\n )\n\n $routeProvider.when(\"/profile/:slug\",\n {\n templateUrl: \"profile/profile.html\",\n loader: true,\n controller: \"Profile\",\n controllerAs: \"vm\"\n }\n )\n\n # Auth\n $routeProvider.when(\"/login\",\n {\n templateUrl: \"auth/login.html\",\n title: \"LOGIN.PAGE_TITLE\",\n description: \"LOGIN.PAGE_DESCRIPTION\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/register\",\n {\n templateUrl: \"auth/register.html\",\n title: \"REGISTER.PAGE_TITLE\",\n description: \"REGISTER.PAGE_DESCRIPTION\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/forgot-password\",\n {\n templateUrl: \"auth/forgot-password.html\",\n title: \"FORGOT_PASSWORD.PAGE_TITLE\",\n description: \"FORGOT_PASSWORD.PAGE_DESCRIPTION\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/change-password/:token\",\n {\n templateUrl: \"auth/change-password-from-recovery.html\",\n title: \"CHANGE_PASSWORD.PAGE_TITLE\",\n description: \"CHANGE_PASSWORD.PAGE_TITLE\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/invitation/:token\",\n {\n templateUrl: \"auth/invitation.html\",\n title: \"INVITATION.PAGE_TITLE\",\n description: \"INVITATION.PAGE_DESCRIPTION\",\n disableHeader: true\n }\n )\n $routeProvider.when(\"/external-apps\",\n {\n templateUrl: \"external-apps/external-app.html\",\n title: \"EXTERNAL_APP.PAGE_TITLE\",\n description: \"EXTERNAL_APP.PAGE_DESCRIPTION\",\n controller: \"ExternalApp\",\n controllerAs: \"vm\",\n disableHeader: true,\n mobileViewport: true\n }\n )\n\n # Errors/Exceptions\n $routeProvider.when(\"/error\",\n {templateUrl: \"error/error.html\"})\n $routeProvider.when(\"/not-found\",\n {templateUrl: \"error/not-found.html\"})\n $routeProvider.when(\"/permission-denied\",\n {templateUrl: \"error/permission-denied.html\"})\n\n $routeProvider.otherwise({redirectTo: \"/not-found\"})\n $locationProvider.html5Mode({enabled: true, requireBase: false})\n\n defaultHeaders = {\n \"Content-Type\": \"application/json\"\n \"Accept-Language\": window.taigaConfig.defaultLanguage || \"en\"\n \"X-Session-Id\": taiga.sessionId\n }\n\n $httpProvider.defaults.headers.delete = defaultHeaders\n $httpProvider.defaults.headers.patch = defaultHeaders\n $httpProvider.defaults.headers.post = defaultHeaders\n $httpProvider.defaults.headers.put = defaultHeaders\n $httpProvider.defaults.headers.get = {\n \"X-Session-Id\": taiga.sessionId\n }\n\n $httpProvider.useApplyAsync(true)\n\n $tgEventsProvider.setSessionId(taiga.sessionId)\n\n # Add next param when user try to access to a secction need auth permissions.\n authHttpIntercept = ($q, $location, $navUrls, $lightboxService) ->\n httpResponseError = (response) ->\n if response.status == 0 || response.status == -1\n $lightboxService.closeAll()\n $location.path($navUrls.resolve(\"error\"))\n $location.replace()\n else if response.status == 401 and $location.url().indexOf('/login') == -1\n nextUrl = encodeURIComponent($location.url())\n $location.url($navUrls.resolve(\"login\")).search(\"next=#{nextUrl}\")\n\n return $q.reject(response)\n\n return {\n responseError: httpResponseError\n }\n\n $provide.factory(\"authHttpIntercept\", [\"$q\", \"$location\", \"$tgNavUrls\", \"lightboxService\",\n authHttpIntercept])\n\n $httpProvider.interceptors.push(\"authHttpIntercept\")\n\n\n loaderIntercept = ($q, loaderService) ->\n return {\n request: (config) ->\n loaderService.logRequest()\n\n return config\n\n requestError: (rejection) ->\n loaderService.logResponse()\n\n return $q.reject(rejection)\n\n responseError: (rejection) ->\n loaderService.logResponse()\n\n return $q.reject(rejection)\n\n response: (response) ->\n loaderService.logResponse()\n\n return response\n }\n\n\n $provide.factory(\"loaderIntercept\", [\"$q\", \"tgLoader\", loaderIntercept])\n\n $httpProvider.interceptors.push(\"loaderIntercept\")\n\n # If there is an error in the version throw a notify error.\n # IMPROVEiMENT: Move this version error handler to USs, issues and tasks repository\n versionCheckHttpIntercept = ($q) ->\n httpResponseError = (response) ->\n if response.status == 400 && response.data.version\n # HACK: to prevent circular dependencies with [$tgConfirm, $translate]\n $injector = angular.element(\"body\").injector()\n $injector.invoke([\"$tgConfirm\", \"$translate\", ($confirm, $translate) =>\n versionErrorMsg = $translate.instant(\"ERROR.VERSION_ERROR\")\n $confirm.notify(\"error\", versionErrorMsg, null, 10000)\n ])\n\n return $q.reject(response)\n\n return {responseError: httpResponseError}\n\n $provide.factory(\"versionCheckHttpIntercept\", [\"$q\", versionCheckHttpIntercept])\n\n $httpProvider.interceptors.push(\"versionCheckHttpIntercept\")\n\n window.checksley.updateValidators({\n linewidth: (val, width) ->\n lines = taiga.nl2br(val).split(\"
\")\n\n valid = _.every lines, (line) ->\n line.length < width\n\n return valid\n })\n\n $compileProvider.debugInfoEnabled(window.taigaConfig.debugInfo || false)\n\n if localStorage.userInfo\n userInfo = JSON.parse(localStorage.userInfo)\n\n # i18n\n preferedLangCode = userInfo?.lang || window.taigaConfig.defaultLanguage || \"en\"\n\n $translateProvider\n .useStaticFilesLoader({\n prefix: \"/locales/locale-\",\n suffix: \".json\"\n })\n .addInterpolation('$translateMessageFormatInterpolation')\n .preferredLanguage(preferedLangCode)\n\n $translateProvider.fallbackLanguage(preferedLangCode)\n\n # decoratos\n decorators = _.where(@.taigaContribPlugins, {\"type\": \"decorator\"})\n\n _.each decorators, (decorator) ->\n $provide.decorator decorator.provider, decorator.decorator\n\n # decoratos\n decorators = _.where(@.taigaContribPlugins, {\"type\": \"decorator\"})\n\n _.each decorators, (decorator) ->\n $provide.decorator decorator.provider, decorator.decorator\n\ni18nInit = (lang, $translate) ->\n # i18n - moment.js\n moment.locale(lang)\n\n # i18n - checksley.js\n messages = {\n defaultMessage: $translate.instant(\"COMMON.FORM_ERRORS.DEFAULT_MESSAGE\")\n type: {\n email: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_EMAIL\")\n url: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URL\")\n urlstrict: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URLSTRICT\")\n number: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_NUMBER\")\n digits: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DIGITS\")\n dateIso: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DATEISO\")\n alphanum: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_ALPHANUM\")\n phone: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_PHONE\")\n }\n notnull: $translate.instant(\"COMMON.FORM_ERRORS.NOTNULL\")\n notblank: $translate.instant(\"COMMON.FORM_ERRORS.NOT_BLANK\")\n required: $translate.instant(\"COMMON.FORM_ERRORS.REQUIRED\")\n regexp: $translate.instant(\"COMMON.FORM_ERRORS.REGEXP\")\n min: $translate.instant(\"COMMON.FORM_ERRORS.MIN\")\n max: $translate.instant(\"COMMON.FORM_ERRORS.MAX\")\n range: $translate.instant(\"COMMON.FORM_ERRORS.RANGE\")\n minlength: $translate.instant(\"COMMON.FORM_ERRORS.MIN_LENGTH\")\n maxlength: $translate.instant(\"COMMON.FORM_ERRORS.MAX_LENGTH\")\n rangelength: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_LENGTH\")\n mincheck: $translate.instant(\"COMMON.FORM_ERRORS.MIN_CHECK\")\n maxcheck: $translate.instant(\"COMMON.FORM_ERRORS.MAX_CHECK\")\n rangecheck: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_CHECK\")\n equalto: $translate.instant(\"COMMON.FORM_ERRORS.EQUAL_TO\")\n }\n checksley.updateMessages('default', messages)\n\n\ninit = ($log, $rootscope, $auth, $events, $analytics, $translate, $location, $navUrls, appMetaService, projectService, loaderService, navigationBarService) ->\n $log.debug(\"Initialize application\")\n\n # Taiga Plugins\n $rootscope.contribPlugins = @.taigaContribPlugins\n $rootscope.adminPlugins = _.where(@.taigaContribPlugins, {\"type\": \"admin\"})\n\n $rootscope.$on \"$translateChangeEnd\", (e, ctx) ->\n lang = ctx.language\n i18nInit(lang, $translate)\n\n # bluebird\n Promise.setScheduler (cb) ->\n $rootscope.$evalAsync(cb)\n\n # Load user\n if $auth.isAuthenticated()\n $events.setupConnection()\n user = $auth.getUser()\n\n # Analytics\n $analytics.initialize()\n\n # On the first page load the loader is painted in `$routeChangeSuccess`\n # because we need to hide the tg-navigation-bar.\n # In the other cases the loader is in `$routeChangeSuccess`\n # because `location.noreload` prevent to execute this event.\n un = $rootscope.$on '$routeChangeStart', (event, next) ->\n if next.loader\n loaderService.start(true)\n\n un()\n\n $rootscope.$on '$routeChangeSuccess', (event, next) ->\n if next.loader\n loaderService.start(true)\n\n if next.access && next.access.requiresLogin\n if !$auth.isAuthenticated()\n $location.path($navUrls.resolve(\"login\"))\n\n projectService.setSection(next.section)\n\n if next.params.pslug\n projectService.setProjectBySlug(next.params.pslug)\n else\n projectService.cleanProject()\n\n if next.title or next.description\n title = $translate.instant(next.title or \"\")\n description = $translate.instant(next.description or \"\")\n appMetaService.setAll(title, description)\n\n if next.mobileViewport\n appMetaService.addMobileViewport()\n else\n appMetaService.removeMobileViewport()\n\n if next.disableHeader\n navigationBarService.disableHeader()\n else\n navigationBarService.enableHeader()\n\npluginsWithModule = _.filter(@.taigaContribPlugins, (plugin) -> plugin.module)\n\npluginsWithModule = _.filter(@.taigaContribPlugins, (plugin) -> plugin.module)\n\nmodules = [\n # Main Global Modules\n \"taigaBase\",\n \"taigaCommon\",\n \"taigaResources\",\n \"taigaResources2\",\n \"taigaAuth\",\n \"taigaEvents\",\n\n # Specific Modules\n \"taigaHome\",\n \"taigaNavigationBar\",\n \"taigaProjects\",\n \"taigaRelatedTasks\",\n \"taigaBacklog\",\n \"taigaTaskboard\",\n \"taigaKanban\",\n \"taigaIssues\",\n \"taigaUserStories\",\n \"taigaTasks\",\n \"taigaTeam\",\n \"taigaWiki\",\n \"taigaSearch\",\n \"taigaAdmin\",\n \"taigaProject\",\n \"taigaUserSettings\",\n \"taigaFeedback\",\n \"taigaPlugins\",\n \"taigaIntegrations\",\n \"taigaComponents\",\n # new modules\n \"taigaProfile\",\n \"taigaHome\",\n \"taigaUserTimeline\",\n \"taigaExternalApps\",\n\n # template cache\n \"templates\",\n\n # Vendor modules\n \"ngRoute\",\n \"ngAnimate\",\n \"ngAria\",\n \"pascalprecht.translate\",\n \"infinite-scroll\",\n \"tgRepeat\"\n].concat(_.map(pluginsWithModule, (plugin) -> plugin.module))\n\n# Main module definition\nmodule = angular.module(\"taiga\", modules)\n\nmodule.config([\n \"$routeProvider\",\n \"$locationProvider\",\n \"$httpProvider\",\n \"$provide\",\n \"$tgEventsProvider\",\n \"$compileProvider\",\n \"$translateProvider\",\n \"$animateProvider\",\n configure\n])\n\nmodule.run([\n \"$log\",\n \"$rootScope\",\n \"$tgAuth\",\n \"$tgEvents\",\n \"$tgAnalytics\",\n \"$translate\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"tgProjectService\",\n \"tgLoader\",\n \"tgNavigationBarService\",\n \"$route\",\n init\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: classes.coffee\n###\n\nclass TaigaBase\nclass TaigaService extends TaigaBase\nclass TaigaController extends TaigaBase\n onInitialDataError: (xhr) =>\n if xhr\n if xhr.status == 404\n @location.path(@navUrls.resolve(\"not-found\"))\n @location.replace()\n else if xhr.status == 403\n @location.path(@navUrls.resolve(\"permission-denied\"))\n @location.replace()\n\n return @q.reject(xhr)\n\n@.taiga.Base = TaigaBase\n@.taiga.Service = TaigaService\n@.taiga.Controller = TaigaController\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: utils.coffee\n###\n\nnl2br = (str) =>\n breakTag = '
'\n return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1' + breakTag + '$2')\n\nbindMethods = (object) =>\n dependencies = _.keys(object)\n\n methods = []\n\n _.forIn object, (value, key) =>\n if key not in dependencies\n methods.push(key)\n\n _.bindAll(object, methods)\n\nbindOnce = (scope, attr, continuation) =>\n val = scope.$eval(attr)\n if val != undefined\n return continuation(val)\n\n delBind = null\n delBind = scope.$watch attr, (val) ->\n return if val is undefined\n continuation(val)\n delBind() if delBind\n\n\nmixOf = (base, mixins...) ->\n class Mixed extends base\n\n for mixin in mixins by -1 #earlier mixins override later ones\n for name, method of mixin::\n Mixed::[name] = method\n Mixed\n\n\ntrim = (data, char) ->\n return _.str.trim(data, char)\n\n\nslugify = (data) ->\n return _.str.slugify(data)\n\n\nunslugify = (data) ->\n if data\n return _.str.capitalize(data.replace(/-/g, ' '))\n return data\n\n\ntoggleText = (element, texts) ->\n nextTextPosition = element.data('nextTextPosition')\n nextTextPosition = 0 if not nextTextPosition? or nextTextPosition >= texts.length\n text = texts[nextTextPosition]\n element.data('nextTextPosition', nextTextPosition + 1)\n element.text(text)\n\n\ngroupBy = (coll, pred) ->\n result = {}\n for item in coll\n result[pred(item)] = item\n\n return result\n\n\ntimeout = (wait, continuation) ->\n return window.setTimeout(continuation, wait)\n\n\ncancelTimeout = (timeoutVar) ->\n window.clearTimeout(timeoutVar)\n\n\nscopeDefer = (scope, func) ->\n _.defer =>\n scope.$apply(func)\n\n\ntoString = (value) ->\n if _.isNumber(value)\n return value + \"\"\n else if _.isString(value)\n return value\n else if _.isPlainObject(value)\n return JSON.stringify(value)\n else if _.isUndefined(value)\n return \"\"\n return value.toString()\n\n\njoinStr = (str, coll) ->\n return _.str.join(str, coll)\n\n\ndebounce = (wait, func) ->\n return _.debounce(func, wait, {leading: true, trailing: false})\n\n\ndebounceLeading = (wait, func) ->\n return _.debounce(func, wait, {leading: false, trailing: true})\n\n\nstartswith = (str1, str2) ->\n return _.str.startsWith(str1, str2)\n\n\ntruncate = (str, maxLength, suffix=\"...\") ->\n return str if (typeof str != \"string\") and not (str instanceof String)\n\n out = str.slice(0)\n\n if out.length > maxLength\n out = out.substring(0, maxLength + 1)\n out = out.substring(0, Math.min(out.length, out.lastIndexOf(\" \")))\n out = out + suffix\n\n return out\n\n\nsizeFormat = (input, precision=1) ->\n if isNaN(parseFloat(input)) or not isFinite(input)\n return \"-\"\n\n if input == 0\n return \"0 bytes\"\n\n units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"]\n number = Math.floor(Math.log(input) / Math.log(1024))\n if number > 5\n number = 5\n size = (input / Math.pow(1024, number)).toFixed(precision)\n return \"#{size} #{units[number]}\"\n\nstripTags = (str, exception) ->\n if exception\n pattern = new RegExp('<(?!' + exception + '\\s*\\/?)[^>]+>', 'gi')\n return String(str).replace(pattern, '')\n else\n return String(str).replace(/<\\/?[^>]+>/g, '')\n\nreplaceTags = (str, tags, replace) ->\n # open tag\n pattern = new RegExp('<(' + tags + ')>', 'gi')\n str = str.replace(pattern, '<' + replace + '>')\n\n # close tag\n pattern = new RegExp('<\\/(' + tags + ')>', 'gi')\n str = str.replace(pattern, '')\n\n return str\n\ndefineImmutableProperty = (obj, name, fn) =>\n Object.defineProperty obj, name, {\n get: () =>\n if !_.isFunction(fn)\n throw \"defineImmutableProperty third param must be a function\"\n\n fn_result = fn()\n if fn_result && _.isObject(fn_result)\n if fn_result.size == undefined\n throw \"defineImmutableProperty must return immutable data\"\n\n return fn_result\n }\n\n_.mixin\n removeKeys: (obj, keys) ->\n _.chain([keys]).flatten().reduce(\n (obj, key) ->\n delete obj[key]; obj\n , obj).value()\n\ntaiga = @.taiga\ntaiga.nl2br = nl2br\ntaiga.bindMethods = bindMethods\ntaiga.bindOnce = bindOnce\ntaiga.mixOf = mixOf\ntaiga.trim = trim\ntaiga.slugify = slugify\ntaiga.unslugify = unslugify\ntaiga.toggleText = toggleText\ntaiga.groupBy = groupBy\ntaiga.timeout = timeout\ntaiga.cancelTimeout = cancelTimeout\ntaiga.scopeDefer = scopeDefer\ntaiga.toString = toString\ntaiga.joinStr = joinStr\ntaiga.truncate = truncate\ntaiga.debounce = debounce\ntaiga.debounceLeading = debounceLeading\ntaiga.startswith = startswith\ntaiga.sizeFormat = sizeFormat\ntaiga.stripTags = stripTags\ntaiga.replaceTags = replaceTags\ntaiga.defineImmutableProperty = defineImmutableProperty\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/controllerMixins.coffee\n###\n\ntaiga = @.taiga\n\ngroupBy = @.taiga.groupBy\njoinStr = @.taiga.joinStr\ntrim = @.taiga.trim\ntoString = @.taiga.toString\n\n\n#############################################################################\n## Page Mixin\n#############################################################################\n\nclass PageMixin\n fillUsersAndRoles: (users, roles) ->\n activeUsers = _.filter(users, (user) => user.is_active)\n @scope.activeUsers = _.sortBy(activeUsers, \"full_name_display\")\n @scope.activeUsersById = groupBy(@scope.activeUsers, (e) -> e.id)\n\n @scope.users = _.sortBy(users, \"full_name_display\")\n @scope.usersById = groupBy(@scope.users, (e) -> e.id)\n\n @scope.roles = _.sortBy(roles, \"order\")\n computableRoles = _(@scope.project.members).map(\"role\").uniq().value()\n @scope.computableRoles = _(roles).filter(\"computable\")\n .filter((x) -> _.contains(computableRoles, x.id))\n .value()\n loadUsersAndRoles: ->\n promise = @q.all([\n @rs.projects.usersList(@scope.projectId),\n @rs.projects.rolesList(@scope.projectId)\n ])\n\n return promise.then (results) =>\n [users, roles] = results\n @.fillUsersAndRoles(users, roles)\n return results\n\ntaiga.PageMixin = PageMixin\n\n\n#############################################################################\n## Filters Mixin\n#############################################################################\n# This mixin requires @location ($tgLocation), and @scope\n\nclass FiltersMixin\n selectFilter: (name, value, load=false) ->\n params = @location.search()\n if params[name] != undefined and name != \"page\"\n existing = _.map(taiga.toString(params[name]).split(\",\"), (x) -> trim(x))\n existing.push(taiga.toString(value))\n existing = _.compact(existing)\n value = joinStr(\",\", _.uniq(existing))\n\n if !@location.isInCurrentRouteParams(name, value)\n location = if load then @location else @location.noreload(@scope)\n location.search(name, value)\n\n replaceFilter: (name, value, load=false) ->\n if !@location.isInCurrentRouteParams(name, value)\n location = if load then @location else @location.noreload(@scope)\n location.search(name, value)\n\n replaceAllFilters: (filters, load=false) ->\n location = if load then @location else @location.noreload(@scope)\n location.search(filters)\n\n unselectFilter: (name, value, load=false) ->\n params = @location.search()\n\n if params[name] is undefined\n return\n\n if value is undefined or value is null\n delete params[name]\n\n parsedValues = _.map(taiga.toString(params[name]).split(\",\"), (x) -> trim(x))\n newValues = _.reject(parsedValues, (x) -> x == taiga.toString(value))\n newValues = _.compact(newValues)\n\n if _.isEmpty(newValues)\n value = null\n else\n value = joinStr(\",\", _.uniq(newValues))\n\n location = if load then @location else @location.noreload(@scope)\n location.search(name, value)\n\ntaiga.FiltersMixin = FiltersMixin\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin.coffee\n###\n\nmodule = angular.module(\"taigaAdmin\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/auth.coffee\n###\n\ntaiga = @.taiga\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaAuth\", [\"taigaResources\"])\n\n#############################################################################\n## Authentication Service\n#############################################################################\n\nclass AuthService extends taiga.Service\n @.$inject = [\"$rootScope\",\n \"$tgStorage\",\n \"$tgModel\",\n \"$tgResources\",\n \"$tgHttp\",\n \"$tgUrls\",\n \"$tgConfig\",\n \"$translate\",\n \"tgCurrentUserService\",\n \"tgThemeService\"]\n\n constructor: (@rootscope, @storage, @model, @rs, @http, @urls, @config, @translate, @currentUserService,\n @themeService) ->\n super()\n\n @._currentTheme = @config.get(\"defaultTheme\") || \"taiga\" # load on index.jade\n\n userModel = @.getUser()\n @.setUserdata(userModel)\n\n setUserdata: (userModel) ->\n if userModel\n @.userData = Immutable.fromJS(userModel.getAttrs())\n @currentUserService.setUser(@.userData)\n else\n @.userData = null\n\n _getUserTheme: ->\n return @rootscope.user?.theme || @config.get(\"defaultTheme\") || \"taiga\"\n\n _setTheme: ->\n newTheme = @._getUserTheme()\n\n if @._currentTheme != newTheme\n @._currentTheme = newTheme\n @themeService.use(@._currentTheme)\n\n _setLocales: ->\n lang = @rootscope.user?.lang || @config.get(\"defaultLanguage\") || \"en\"\n @translate.preferredLanguage(lang) # Needed for calls to the api in the correct language\n @translate.use(lang) # Needed for change the interface in runtime\n\n getUser: ->\n if @rootscope.user\n return @rootscope.user\n\n userData = @storage.get(\"userInfo\")\n if userData\n user = @model.make_model(\"users\", userData)\n @rootscope.user = user\n @._setLocales()\n\n @._setTheme()\n\n return user\n\n return null\n\n setUser: (user) ->\n @rootscope.auth = user\n @storage.set(\"userInfo\", user.getAttrs())\n @rootscope.user = user\n\n @.setUserdata(user)\n\n @._setLocales()\n @._setTheme()\n\n clear: ->\n @rootscope.auth = null\n @rootscope.user = null\n @storage.remove(\"userInfo\")\n\n setToken: (token) ->\n @storage.set(\"token\", token)\n\n getToken: ->\n return @storage.get(\"token\")\n\n removeToken: ->\n @storage.remove(\"token\")\n\n isAuthenticated: ->\n if @.getUser() != null\n return true\n return false\n\n ## Http interface\n\n login: (data, type) ->\n url = @urls.resolve(\"auth\")\n\n data = _.clone(data, false)\n data.type = if type then type else \"normal\"\n\n @.removeToken()\n\n return @http.post(url, data).then (data, status) =>\n user = @model.make_model(\"users\", data.data)\n @.setToken(user.auth_token)\n @.setUser(user)\n return user\n\n logout: ->\n @.removeToken()\n @.clear()\n @currentUserService.removeUser()\n\n @._setTheme()\n @._setLocales()\n\n\n register: (data, type, existing) ->\n url = @urls.resolve(\"auth-register\")\n\n data = _.clone(data, false)\n data.type = if type then type else \"public\"\n if type == \"private\"\n data.existing = if existing then existing else false\n\n @.removeToken()\n\n return @http.post(url, data).then (response) =>\n user = @model.make_model(\"users\", response.data)\n @.setToken(user.auth_token)\n @.setUser(user)\n return user\n\n getInvitation: (token) ->\n return @rs.invitations.get(token)\n\n acceptInvitiationWithNewUser: (data) ->\n return @.register(data, \"private\", false)\n\n acceptInvitiationWithExistingUser: (data) ->\n return @.register(data, \"private\", true)\n\n forgotPassword: (data) ->\n url = @urls.resolve(\"users-password-recovery\")\n data = _.clone(data, false)\n @.removeToken()\n return @http.post(url, data)\n\n changePasswordFromRecovery: (data) ->\n url = @urls.resolve(\"users-change-password-from-recovery\")\n data = _.clone(data, false)\n @.removeToken()\n return @http.post(url, data)\n\n changeEmail: (data) ->\n url = @urls.resolve(\"users-change-email\")\n data = _.clone(data, false)\n return @http.post(url, data)\n\n cancelAccount: (data) ->\n url = @urls.resolve(\"users-cancel-account\")\n data = _.clone(data, false)\n return @http.post(url, data)\n\nmodule.service(\"$tgAuth\", AuthService)\n\n\n#############################################################################\n## Login Directive\n#############################################################################\n\n# Directive that manages the visualization of public register\n# message/link on login page.\n\nPublicRegisterMessageDirective = ($config, $navUrls, templates) ->\n template = templates.get(\"auth/login-text.html\", true)\n\n templateFn = ->\n publicRegisterEnabled = $config.get(\"publicRegisterEnabled\")\n if not publicRegisterEnabled\n return \"\"\n return template({url:$navUrls.resolve(\"register\")})\n\n return {\n restrict: \"AE\"\n scope: {}\n template: templateFn\n }\n\nmodule.directive(\"tgPublicRegisterMessage\", [\"$tgConfig\", \"$tgNavUrls\", \"$tgTemplate\",\n PublicRegisterMessageDirective])\n\n\nLoginDirective = ($auth, $confirm, $location, $config, $routeParams, $navUrls, $events, $translate) ->\n link = ($scope, $el, $attrs) ->\n onSuccess = (response) ->\n if $routeParams['next'] and $routeParams['next'] != $navUrls.resolve(\"login\")\n nextUrl = decodeURIComponent($routeParams['next'])\n else\n nextUrl = $navUrls.resolve(\"home\")\n\n $events.setupConnection()\n $location.url(nextUrl)\n\n onError = (response) ->\n $confirm.notify(\"light-error\", $translate.instant(\"LOGIN_FORM.ERROR_AUTH_INCORRECT\"))\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = new checksley.Form($el.find(\"form.login-form\"))\n if not form.validate()\n return\n\n data = {\n \"username\": $el.find(\"form.login-form input[name=username]\").val(),\n \"password\": $el.find(\"form.login-form input[name=password]\").val()\n }\n\n loginFormType = $config.get(\"loginFormType\", \"normal\")\n\n promise = $auth.login(data, loginFormType)\n return promise.then(onSuccess, onError)\n\n $el.on \"submit\", \"form\", submit\n\n window.prerenderReady = true\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgLogin\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgConfig\", \"$routeParams\",\n \"$tgNavUrls\", \"$tgEvents\", \"$translate\", LoginDirective])\n\n\n#############################################################################\n## Register Directive\n#############################################################################\n\nRegisterDirective = ($auth, $confirm, $location, $navUrls, $config, $analytics, $translate) ->\n link = ($scope, $el, $attrs) ->\n if not $config.get(\"publicRegisterEnabled\")\n $location.path($navUrls.resolve(\"not-found\"))\n $location.replace()\n\n $scope.data = {}\n form = $el.find(\"form\").checksley({onlyOneErrorElement: true})\n\n onSuccessSubmit = (response) ->\n $analytics.trackEvent(\"auth\", \"register\", \"user registration\", 1)\n\n $confirm.notify(\"success\", $translate.instant(\"LOGIN_FORM.SUCCESS\"))\n\n $location.path($navUrls.resolve(\"home\"))\n\n onErrorSubmit = (response) ->\n if response.data._error_message\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {error: response.data._error_message})\n $confirm.notify(\"light-error\", text)\n\n form.setErrors(response.data)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n promise = $auth.register($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n window.prerenderReady = true\n\n return {link:link}\n\nmodule.directive(\"tgRegister\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfig\",\n \"$tgAnalytics\", \"$translate\", RegisterDirective])\n\n\n#############################################################################\n## Forgot Password Directive\n#############################################################################\n\nForgotPasswordDirective = ($auth, $confirm, $location, $navUrls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $scope.data = {}\n form = $el.find(\"form\").checksley()\n\n onSuccessSubmit = (response) ->\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS\")\n $confirm.success(text)\n\n onErrorSubmit = (response) ->\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.ERROR\")\n\n $confirm.notify(\"light-error\", text)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n promise = $auth.forgotPassword($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n window.prerenderReady = true\n\n return {link:link}\n\nmodule.directive(\"tgForgotPassword\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$translate\",\n ForgotPasswordDirective])\n\n\n#############################################################################\n## Change Password from Recovery Directive\n#############################################################################\n\nChangePasswordFromRecoveryDirective = ($auth, $confirm, $location, $params, $navUrls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $scope.data = {}\n\n if $params.token?\n $scope.tokenInParams = true\n $scope.data.token = $params.token\n else\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\")\n $confirm.notify(\"light-error\",text)\n\n form = $el.find(\"form\").checksley()\n\n onSuccessSubmit = (response) ->\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS\")\n $confirm.success(text)\n\n onErrorSubmit = (response) ->\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\")\n $confirm.notify(\"light-error\", text)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n promise = $auth.changePasswordFromRecovery($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgChangePasswordFromRecovery\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\",\n \"$tgNavUrls\", \"$translate\",\n ChangePasswordFromRecoveryDirective])\n\n\n#############################################################################\n## Invitation\n#############################################################################\n\nInvitationDirective = ($auth, $confirm, $location, $params, $navUrls, $analytics, $translate) ->\n link = ($scope, $el, $attrs) ->\n token = $params.token\n\n promise = $auth.getInvitation(token)\n promise.then (invitation) ->\n $scope.invitation = invitation\n\n promise.then null, (response) ->\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"INVITATION_LOGIN_FORM.NOT_FOUND\")\n $confirm.notify(\"light-error\", text)\n\n # Login form\n $scope.dataLogin = {token: token}\n loginForm = $el.find(\"form.login-form\").checksley({onlyOneErrorElement: true})\n\n onSuccessSubmitLogin = (response) ->\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with existing user\", 1)\n $location.path($navUrls.resolve(\"project\", {project: $scope.invitation.project_slug}))\n text = $translate.instant(\"INVITATION_LOGIN_FORM.SUCCESS\", {\n \"project_name\": $scope.invitation.project_name\n })\n\n $confirm.notify(\"success\", text)\n\n onErrorSubmitLogin = (response) ->\n text = $translate.instant(\"INVITATION_LOGIN_FORM.ERROR\")\n\n $confirm.notify(\"light-error\", text)\n\n submitLogin = debounce 2000, (event) =>\n event.preventDefault()\n\n if not loginForm.validate()\n return\n\n promise = $auth.acceptInvitiationWithExistingUser($scope.dataLogin)\n promise.then(onSuccessSubmitLogin, onErrorSubmitLogin)\n\n $el.on \"submit\", \"form.login-form\", submitLogin\n $el.on \"click\", \".button-login\", submitLogin\n\n # Register form\n $scope.dataRegister = {token: token}\n registerForm = $el.find(\"form.register-form\").checksley({onlyOneErrorElement: true})\n\n onSuccessSubmitRegister = (response) ->\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with new user\", 1)\n $location.path($navUrls.resolve(\"project\", {project: $scope.invitation.project_slug}))\n $confirm.notify(\"success\", \"You've successfully joined this project\",\n \"Welcome to #{_.escape($scope.invitation.project_name)}\")\n\n onErrorSubmitRegister = (response) ->\n if response.data._error_message\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {error: response.data._error_message})\n $confirm.notify(\"light-error\", text)\n\n registerForm.setErrors(response.data)\n\n submitRegister = debounce 2000, (event) =>\n event.preventDefault()\n\n if not registerForm.validate()\n return\n\n promise = $auth.acceptInvitiationWithNewUser($scope.dataRegister)\n promise.then(onSuccessSubmitRegister, onErrorSubmitRegister)\n\n $el.on \"submit\", \"form.register-form\", submitRegister\n $el.on \"click\", \".button-register\", submitRegister\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgInvitation\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\",\n \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", InvitationDirective])\n\n\n#############################################################################\n## Change Email\n#############################################################################\n\nChangeEmailDirective = ($repo, $model, $auth, $confirm, $location, $params, $navUrls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $scope.data = {}\n $scope.data.email_token = $params.email_token\n form = $el.find(\"form\").checksley()\n\n onSuccessSubmit = (response) ->\n if $auth.isAuthenticated()\n $repo.queryOne(\"users\", $auth.getUser().id).then (data) =>\n $auth.setUser(data)\n $location.path($navUrls.resolve(\"home\"))\n else\n $location.path($navUrls.resolve(\"login\"))\n\n text = $translate.instant(\"CHANGE_EMAIL_FORM.SUCCESS\")\n $confirm.success(text)\n\n onErrorSubmit = (response) ->\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {error: response.data._error_message})\n\n $confirm.notify(\"light-error\", text)\n\n submit = ->\n if not form.validate()\n return\n\n promise = $auth.changeEmail($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", (event) ->\n event.preventDefault()\n submit()\n\n $el.on \"click\", \"a.button-change-email\", (event) ->\n event.preventDefault()\n submit()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgChangeEmail\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\",\n \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangeEmailDirective])\n\n\n#############################################################################\n## Cancel account\n#############################################################################\n\nCancelAccountDirective = ($repo, $model, $auth, $confirm, $location, $params, $navUrls) ->\n link = ($scope, $el, $attrs) ->\n $scope.data = {}\n $scope.data.cancel_token = $params.cancel_token\n form = $el.find(\"form\").checksley()\n\n onSuccessSubmit = (response) ->\n $auth.logout()\n $location.path($navUrls.resolve(\"home\"))\n\n text = $translate.instant(\"CANCEL_ACCOUNT.SUCCESS\")\n\n $confirm.success(text)\n\n onErrorSubmit = (response) ->\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {error: response.data._error_message})\n\n $confirm.notify(\"error\", text)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n promise = $auth.cancelAccount($scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgCancelAccount\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\",\n \"$routeParams\",\"$tgNavUrls\", CancelAccountDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog.coffee\n###\n\nmodule = angular.module(\"taigaBacklog\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base.coffee\n###\n\ntaiga = @.taiga\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaBase\", [])\n\n#############################################################################\n## Main Directive\n#############################################################################\n\nTaigaMainDirective = ($rootscope, $window) ->\n link = ($scope, $el, $attrs) ->\n $window.onresize = () ->\n $rootscope.$broadcast(\"resize\")\n\n return {link:link}\n\nmodule.directive(\"tgMain\", [\"$rootScope\", \"$window\", TaigaMainDirective])\n\n#############################################################################\n## Navigation\n#############################################################################\n\nurls = {\n \"home\": \"/\"\n \"projects\": \"/projects\"\n \"error\": \"/error\"\n \"not-found\": \"/not-found\"\n \"permission-denied\": \"/permission-denied\"\n\n \"login\": \"/login\"\n \"forgot-password\": \"/forgot-password\"\n \"change-password\": \"/change-password/:token\"\n \"change-email\": \"/change-email/:token\"\n \"cancel-account\": \"/cancel-account/:token\"\n \"register\": \"/register\"\n \"invitation\": \"/invitation/:token\"\n \"create-project\": \"/create-project\"\n\n \"profile\": \"/profile\"\n \"user-profile\": \"/profile/:username\"\n\n \"project\": \"/project/:project\"\n \"project-backlog\": \"/project/:project/backlog\"\n \"project-taskboard\": \"/project/:project/taskboard/:sprint\"\n \"project-kanban\": \"/project/:project/kanban\"\n \"project-issues\": \"/project/:project/issues\"\n \"project-search\": \"/project/:project/search\"\n\n \"project-userstories-detail\": \"/project/:project/us/:ref\"\n \"project-tasks-detail\": \"/project/:project/task/:ref\"\n \"project-issues-detail\": \"/project/:project/issue/:ref\"\n\n \"project-wiki\": \"/project/:project/wiki\"\n \"project-wiki-page\": \"/project/:project/wiki/:slug\"\n\n # Team\n \"project-team\": \"/project/:project/team\"\n\n # Admin\n \"project-admin-home\": \"/project/:project/admin/project-profile/details\"\n \"project-admin-project-profile-details\": \"/project/:project/admin/project-profile/details\"\n \"project-admin-project-profile-default-values\": \"/project/:project/admin/project-profile/default-values\"\n \"project-admin-project-profile-modules\": \"/project/:project/admin/project-profile/modules\"\n \"project-admin-project-profile-export\": \"/project/:project/admin/project-profile/export\"\n \"project-admin-project-profile-reports\": \"/project/:project/admin/project-profile/reports\"\n\n \"project-admin-project-values-status\": \"/project/:project/admin/project-values/status\"\n \"project-admin-project-values-points\": \"/project/:project/admin/project-values/points\"\n \"project-admin-project-values-priorities\": \"/project/:project/admin/project-values/priorities\"\n \"project-admin-project-values-severities\": \"/project/:project/admin/project-values/severities\"\n \"project-admin-project-values-types\": \"/project/:project/admin/project-values/types\"\n \"project-admin-project-values-custom-fields\": \"/project/:project/admin/project-values/custom-fields\"\n\n \"project-admin-memberships\": \"/project/:project/admin/memberships\"\n \"project-admin-roles\": \"/project/:project/admin/roles\"\n \"project-admin-third-parties-webhooks\": \"/project/:project/admin/third-parties/webhooks\"\n \"project-admin-third-parties-github\": \"/project/:project/admin/third-parties/github\"\n \"project-admin-third-parties-gitlab\": \"/project/:project/admin/third-parties/gitlab\"\n \"project-admin-third-parties-bitbucket\": \"/project/:project/admin/third-parties/bitbucket\"\n \"project-admin-contrib\": \"/project/:project/admin/contrib/:plugin\"\n\n # User settings\n \"user-settings-user-profile\": \"/user-settings/user-profile\"\n \"user-settings-user-change-password\": \"/user-settings/user-change-password\"\n \"user-settings-user-avatar\": \"/user-settings/user-avatar\"\n \"user-settings-mail-notifications\": \"/user-settings/mail-notifications\"\n\n}\n\ninit = ($log, $navurls) ->\n $log.debug \"Initialize navigation urls\"\n $navurls.update(urls)\n\nmodule.run([\"$log\", \"$tgNavUrls\", init])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common.coffee\n###\n\ntaiga = @.taiga\n\nmodule = angular.module(\"taigaCommon\", [])\n\n#############################################################################\n## Default datepicker config\n#############################################################################\nDataPickerConfig = ($translate) ->\n return {\n get: () ->\n return {\n i18n: {\n previousMonth: $translate.instant(\"COMMON.PICKERDATE.PREV_MONTH\"),\n nextMonth: $translate.instant(\"COMMON.PICKERDATE.NEXT_MONTH\"),\n months: [\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.JAN\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.FEB\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAR\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.APR\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAY\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUN\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUL\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.AUG\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.SEP\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.OCT\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.NOV\"),\n $translate.instant(\"COMMON.PICKERDATE.MONTHS.DEC\")\n ],\n weekdays: [\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SUN\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.MON\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.TUE\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.WED\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.THU\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.FRI\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SAT\")\n ],\n weekdaysShort: [\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SUN\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.MON\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.TUE\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.WED\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.THU\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.FRI\"),\n $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SAT\")\n ]\n },\n isRTL: $translate.instant(\"COMMON.PICKERDATE.IS_RTL\") == \"true\",\n firstDay: parseInt($translate.instant(\"COMMON.PICKERDATE.FIRST_DAY_OF_WEEK\"), 10),\n format: $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n }\n }\n\nmodule.factory(\"tgDatePickerConfigService\", [\"$translate\", DataPickerConfig])\n\n#############################################################################\n## Get the selected text\n#############################################################################\nSelectedText = ($window, $document) ->\n get = () ->\n if $window.getSelection\n return $window.getSelection().toString()\n else if $document.selection\n return $document.selection.createRange().text\n return \"\"\n\n return {get: get}\n\nmodule.factory(\"$selectedText\", [\"$window\", \"$document\", SelectedText])\n\n#############################################################################\n## Permission directive, hide elements when necessary\n#############################################################################\n\nCheckPermissionDirective = ->\n render = ($el, project, permission) ->\n $el.removeClass('hidden') if project.my_permissions.indexOf(permission) > -1\n\n link = ($scope, $el, $attrs) ->\n $el.addClass('hidden')\n permission = $attrs.tgCheckPermission\n\n $scope.$watch \"project\", (project) ->\n render($el, project, permission) if project?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgCheckPermission\", CheckPermissionDirective)\n\n#############################################################################\n## Add class based on permissions\n#############################################################################\n\nClassPermissionDirective = ->\n name = \"tgClassPermission\"\n\n link = ($scope, $el, $attrs) ->\n checkPermissions = (project, className, permission) ->\n negation = permission[0] == \"!\"\n\n permission = permission.slice(1) if negation\n\n if negation && project.my_permissions.indexOf(permission) == -1\n $el.addClass(className)\n else if !negation && project.my_permissions.indexOf(permission) != -1\n $el.addClass(className)\n else\n $el.removeClass(className)\n\n tgClassPermissionWatchAction = (project) ->\n if project\n unbindWatcher()\n\n classes = $scope.$eval($attrs[name])\n\n for className, permission of classes\n checkPermissions(project, className, permission)\n\n\n unbindWatcher = $scope.$watch \"project\", tgClassPermissionWatchAction\n\n return {link:link}\n\nmodule.directive(\"tgClassPermission\", ClassPermissionDirective)\n\n#############################################################################\n## Animation frame service, apply css changes in the next render frame\n#############################################################################\nAnimationFrame = () ->\n animationFrame =\n window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame\n\n performAnimation = (time) =>\n fn = tail.shift()\n fn()\n\n if (tail.length)\n animationFrame(performAnimation)\n\n tail = []\n\n add = () ->\n for fn in arguments\n tail.push(fn)\n\n if tail.length == 1\n animationFrame(performAnimation)\n\n return {add: add}\n\nmodule.factory(\"animationFrame\", AnimationFrame)\n\n#############################################################################\n## Open/close comment\n#############################################################################\n\nToggleCommentDirective = () ->\n link = ($scope, $el, $attrs) ->\n $el.find(\"textarea\").on \"focus\", () ->\n $el.addClass(\"active\")\n\n return {link:link}\n\nmodule.directive(\"tgToggleComment\", ToggleCommentDirective)\n\n\n#############################################################################\n## Get the appropiate section url for a project\n## according to his enabled modules and user permisions\n#############################################################################\n\nProjectUrl = ($navurls) ->\n get = (project) ->\n ctx = {project: project.slug}\n\n if project.is_backlog_activated and project.my_permissions.indexOf(\"view_us\") > -1\n return $navurls.resolve(\"project-backlog\", ctx)\n if project.is_kanban_activated and project.my_permissions.indexOf(\"view_us\") > -1\n return $navurls.resolve(\"project-kanban\", ctx)\n if project.is_wiki_activated and project.my_permissions.indexOf(\"view_wiki_pages\") > -1\n return $navurls.resolve(\"project-wiki\", ctx)\n if project.is_issues_activated and project.my_permissions.indexOf(\"view_issues\") > -1\n return $navurls.resolve(\"project-issues\", ctx)\n\n return $navurls.resolve(\"project\", ctx)\n\n return {get: get}\n\nmodule.factory(\"$projectUrl\", [\"$tgNavUrls\", ProjectUrl])\n\n\n#############################################################################\n## Limite line size in a text area\n#############################################################################\n\nLimitLineLengthDirective = () ->\n link = ($scope, $el, $attrs) ->\n maxColsPerLine = parseInt($el.attr(\"cols\"))\n $el.on \"keyup\", (event) ->\n code = event.keyCode\n lines = $el.val().split(\"\\n\")\n\n _.each lines, (line, index) ->\n lines[index] = line.substring(0, maxColsPerLine - 2)\n\n $el.val(lines.join(\"\\n\"))\n\n return {link:link}\n\nmodule.directive(\"tgLimitLineLength\", LimitLineLengthDirective)\n\n#############################################################################\n## Queue Q promises\n#############################################################################\n\nQqueue = ($q) ->\n deferred = $q.defer()\n deferred.resolve()\n\n lastPromise = deferred.promise\n\n qqueue = {\n bindAdd: (fn) =>\n return (args...) =>\n lastPromise = lastPromise.then () => fn.apply(@, args)\n\n return qqueue\n add: (fn) =>\n if !lastPromise\n lastPromise = fn()\n else\n lastPromise = lastPromise.then(fn)\n\n return qqueue\n }\n\n return qqueue\n\nmodule.factory(\"$tgQqueue\", [\"$q\", Qqueue])\n\n#############################################################################\n## Templates\n#############################################################################\n\nTemplate = ($templateCache) ->\n return {\n get: (name, lodash = false) =>\n tmp = $templateCache.get(name)\n\n if lodash\n tmp = _.template(tmp)\n\n return tmp\n }\n\nmodule.factory(\"$tgTemplate\", [\"$templateCache\", Template])\n\n#############################################################################\n## Permission directive, hide elements when necessary\n#############################################################################\n\nCapslock = ($translate) ->\n link = ($scope, $el, $attrs) ->\n open = false\n\n warningIcon = $('
')\n .addClass('icon')\n .addClass('icon-capslock')\n .attr('title', $translate.instant('COMMON.CAPSLOCK_WARNING'))\n\n hideIcon = () ->\n warningIcon.fadeOut () ->\n open = false\n\n $(this).remove()\n\n showIcon = (e) ->\n return if open\n element = e.currentTarget\n $(element).parent().append(warningIcon)\n $('.icon-capslock').fadeIn()\n\n open = true\n\n $el.on 'blur', (e) ->\n hideIcon()\n\n $el.on 'keyup.capslock, focus', (e) ->\n if $el.val() == $el.val().toLowerCase()\n hideIcon(e)\n else\n showIcon(e)\n\n $scope.$on \"$destroy\", ->\n $el.off('.capslock')\n\n return {link:link}\n\nmodule.directive(\"tgCapslock\", [\"$translate\", Capslock])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/events.coffee\n###\n\ntaiga = @.taiga\nstartswith = @.taiga.startswith\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaEvents\", [])\n\n\nclass EventsService\n constructor: (@win, @log, @config, @auth) ->\n bindMethods(@)\n\n initialize: (sessionId) ->\n @.sessionId = sessionId\n @.subscriptions = {}\n @.connected = false\n @.error = false\n @.pendingMessages = []\n\n if @win.WebSocket is undefined\n @log.info \"WebSockets not supported on your browser\"\n\n setupConnection: ->\n @.stopExistingConnection()\n\n url = @config.get(\"eventsUrl\")\n\n # This allows disable events in case\n # url is not found on the configuration.\n return if not url\n\n # This allows relative urls in configuration.\n if not startswith(url, \"ws:\") and not startswith(url, \"wss:\")\n loc = @win.location\n scheme = if loc.protocol == \"https:\" then \"wss:\" else \"ws:\"\n path = _.str.ltrim(url, \"/\")\n url = \"#{scheme}//#{loc.host}/#{path}\"\n\n @.ws = new @win.WebSocket(url)\n @.ws.addEventListener(\"open\", @.onOpen)\n @.ws.addEventListener(\"message\", @.onMessage)\n @.ws.addEventListener(\"error\", @.onError)\n @.ws.addEventListener(\"close\", @.onClose)\n\n stopExistingConnection: ->\n if @.ws is undefined\n return\n\n @.ws.removeEventListener(\"open\", @.onOpen)\n @.ws.removeEventListener(\"close\", @.onClose)\n @.ws.removeEventListener(\"error\", @.onError)\n @.ws.removeEventListener(\"message\", @.onMessage)\n @.ws.close()\n\n delete @.ws\n\n serialize: (message) ->\n if _.isObject(message)\n return JSON.stringify(message)\n return message\n\n sendMessage: (message) ->\n @.pendingMessages.push(message)\n\n if not @.connected\n return\n\n messages = _.map(@.pendingMessages, @.serialize)\n @.pendingMessages = []\n\n for msg in messages\n @.ws.send(msg)\n\n subscribe: (scope, routingKey, callback) ->\n if @.error\n return\n\n @log.debug(\"Subscribe to: #{routingKey}\")\n subscription = {\n scope: scope,\n routingKey: routingKey,\n callback: _.debounce(callback, 500, {\"leading\": true, \"trailing\": false})\n }\n\n message = {\n \"cmd\": \"subscribe\",\n \"routing_key\": routingKey\n }\n\n @.subscriptions[routingKey] = subscription\n @.sendMessage(message)\n scope.$on(\"$destroy\", => @.unsubscribe(routingKey))\n\n unsubscribe: (routingKey) ->\n if @.error\n return\n\n @log.debug(\"Unsubscribe from: #{routingKey}\")\n\n message = {\n \"cmd\": \"unsubscribe\",\n \"routing_key\": routingKey\n }\n\n @.sendMessage(message)\n\n onOpen: ->\n @.connected = true\n\n @log.debug(\"WebSocket connection opened\")\n token = @auth.getToken()\n\n message = {\n cmd: \"auth\"\n data: {token: token, sessionId: @.sessionId}\n }\n\n @.sendMessage(message)\n\n onMessage: (event) ->\n @.log.debug \"WebSocket message received: #{event.data}\"\n\n data = JSON.parse(event.data)\n routingKey = data.routing_key\n\n if not @.subscriptions[routingKey]?\n return\n\n subscription = @.subscriptions[routingKey]\n subscription.scope.$apply ->\n subscription.callback(data.data)\n\n onError: (error) ->\n @log.error(\"WebSocket error: #{error}\")\n @.error = true\n\n onClose: ->\n @log.debug(\"WebSocket closed.\")\n @.connected = false\n\n\nclass EventsProvider\n setSessionId: (sessionId) ->\n @.sessionId = sessionId\n\n $get: ($win, $log, $conf, $auth) ->\n service = new EventsService($win, $log, $conf, $auth)\n service.initialize(@.sessionId)\n return service\n\n @.prototype.$get.$inject = [\"$window\", \"$log\", \"$tgConfig\", \"$tgAuth\"]\n\nmodule.provider(\"$tgEvents\", EventsProvider)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/feedback.coffee\n###\n\ntaiga = @.taiga\n\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nmixOf = @.taiga.mixOf\ndebounce = @.taiga.debounce\ntrim = @.taiga.trim\n\nmodule = angular.module(\"taigaFeedback\", [])\n\nFeedbackDirective = ($lightboxService, $repo, $confirm, $loading, feedbackService)->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley()\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.create(\"feedback\", $scope.feedback)\n\n promise.then (data) ->\n currentLoading.finish()\n $lightboxService.close($el)\n $confirm.notify(\"success\", \"\\\\o/ we'll be happy to read your\")\n\n promise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n openLightbox = ->\n $scope.feedback = {}\n $lightboxService.open($el)\n $el.find(\"textarea\").focus()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n openLightbox()\n\n directive = {\n link: link,\n templateUrl: \"common/lightbox-feedback.html\"\n scope: {}\n }\n\n return directive\n\nmodule.directive(\"tgLbFeedback\", [\"lightboxService\", \"$tgRepo\", \"$tgConfirm\",\n \"$tgLoading\", \"tgFeedbackService\", FeedbackDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/integrations.coffee\n###\n\nmodule = angular.module(\"taigaIntegrations\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues.coffee\n###\n\nmodule = angular.module(\"taigaIssues\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/kanban.coffee\n###\n\nmodule = angular.module(\"taigaKanban\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/projects.coffee\n###\n\nmodule = angular.module(\"taigaProject\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/related-tasks.coffee\n###\n\ntaiga = @.taiga\ntrim = @.taiga.trim\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaRelatedTasks\", [])\n\nRelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $template, $translate) ->\n templateView = $template.get(\"task/related-task-row.html\", true)\n templateEdit = $template.get(\"task/related-task-row-edit.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n saveTask = debounce 2000, (task) ->\n task.subject = $el.find('input').val()\n\n currentLoading = $loading()\n .target($el.find('.task-name'))\n .start()\n\n promise = $repo.save(task)\n promise.then =>\n currentLoading.finish()\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"related-tasks:update\")\n\n promise.then null, =>\n currentLoading.finish()\n $el.find('input').val(task.subject)\n $confirm.notify(\"error\")\n return promise\n\n renderEdit = (task) ->\n $el.html($compile(templateEdit({task: task}))($scope))\n\n $el.on \"keyup\", \"input\", (event) ->\n if event.keyCode == 13\n saveTask($model.$modelValue).then ->\n renderView($model.$modelValue)\n else if event.keyCode == 27\n renderView($model.$modelValue)\n\n $el.on \"click\", \".icon-floppy\", (event) ->\n saveTask($model.$modelValue).then ->\n renderView($model.$modelValue)\n\n $el.on \"click\", \".cancel-edit\", (event) ->\n renderView($model.$modelValue)\n\n renderView = (task) ->\n $el.off()\n\n perms = {\n modify_task: $scope.project.my_permissions.indexOf(\"modify_task\") != -1\n delete_task: $scope.project.my_permissions.indexOf(\"delete_task\") != -1\n }\n\n $el.html($compile(templateView({task: task, perms: perms}))($scope))\n\n $el.on \"click\", \".icon-edit\", ->\n renderEdit($model.$modelValue)\n $el.find('input').focus().select()\n\n $el.on \"click\", \".delete-task\", (event) ->\n title = $translate.instant(\"TASK.TITLE_DELETE_ACTION\")\n task = $model.$modelValue\n message = task.subject\n\n $confirm.askOnDelete(title, message).then (askResponse) ->\n promise = $repo.remove(task)\n promise.then ->\n askResponse.finish()\n $confirm.notify(\"success\")\n $scope.$emit(\"related-tasks:delete\")\n\n promise.then null, ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n $scope.$watch $attrs.ngModel, (val) ->\n return if not val\n renderView(val)\n\n $scope.$on \"related-tasks:assigned-to-changed\", ->\n $rootscope.$broadcast(\"related-tasks:update\")\n\n $scope.$on \"related-tasks:status-changed\", ->\n $rootscope.$broadcast(\"related-tasks:update\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link, require:\"ngModel\"}\n\nmodule.directive(\"tgRelatedTaskRow\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"$tgTemplate\", \"$translate\", RelatedTaskRowDirective])\n\nRelatedTaskCreateFormDirective = ($repo, $compile, $confirm, $tgmodel, $loading, $analytics, $template) ->\n template = $template.get(\"task/related-task-create-form.html\", true)\n\n newTask = {\n subject: \"\"\n assigned_to: null\n }\n\n link = ($scope, $el, $attrs) ->\n createTask = debounce 2000, (task) ->\n task.subject = $el.find('input').val()\n task.assigned_to = $scope.newTask.assigned_to\n task.status = $scope.newTask.status\n $scope.newTask.status = $scope.project.default_task_status\n $scope.newTask.assigned_to = null\n\n currentLoading = $loading()\n .target($el.find('.task-name'))\n .start()\n\n promise = $repo.create(\"tasks\", task)\n promise.then ->\n $analytics.trackEvent(\"task\", \"create\", \"create task on userstory\", 1)\n currentLoading.finish()\n $scope.$emit(\"related-tasks:add\")\n $confirm.notify(\"success\")\n\n promise.then null, ->\n $el.find('input').val(task.subject)\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n return promise\n\n close = () ->\n $el.off()\n $el.html(\"\")\n\n $scope.newRelatedTaskFormOpen = false\n\n render = ->\n $scope.newRelatedTaskFormOpen = true\n\n $el.html($compile(template())($scope))\n $el.find('input').focus().select()\n $el.addClass('active')\n\n $el.on \"keyup\", \"input\", (event)->\n if event.keyCode == 13\n createTask(newTask).then ->\n render()\n else if event.keyCode == 27\n $scope.$apply () -> close()\n\n $el.on \"click\", \".icon-delete\", (event)->\n $scope.$apply () -> close()\n\n $el.on \"click\", \".icon-floppy\", (event)->\n createTask(newTask).then ->\n close()\n\n taiga.bindOnce $scope, \"us\", (val) ->\n newTask[\"status\"] = $scope.project.default_task_status\n newTask[\"project\"] = $scope.project.id\n newTask[\"user_story\"] = $scope.us.id\n $scope.newTask = $tgmodel.make_model(\"tasks\", newTask)\n $el.html(\"\")\n\n $scope.$on \"related-tasks:show-form\", ->\n render()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\nmodule.directive(\"tgRelatedTaskCreateForm\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgLoading\", \"$tgAnalytics\", \"$tgTemplate\", RelatedTaskCreateFormDirective])\n\nRelatedTaskCreateButtonDirective = ($repo, $compile, $confirm, $tgmodel) ->\n template = _.template(\"\"\"\n \n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n $scope.$watch \"project\", (val) ->\n return if not val\n $el.off()\n if $scope.project.my_permissions.indexOf(\"add_task\") != -1\n $el.html($compile(template())($scope))\n else\n $el.html(\"\")\n\n $el.on \"click\", \".icon\", (event)->\n $scope.$emit(\"related-tasks:add-new-clicked\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\nmodule.directive(\"tgRelatedTaskCreateButton\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", RelatedTaskCreateButtonDirective])\n\nRelatedTasksDirective = ($repo, $rs, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n loadTasks = ->\n return $rs.tasks.list($scope.projectId, null, $scope.usId).then (tasks) =>\n $scope.tasks = _.sortBy(tasks, 'ref')\n return tasks\n\n $scope.$on \"related-tasks:add\", ->\n loadTasks().then ->\n $rootscope.$broadcast(\"related-tasks:update\")\n\n $scope.$on \"related-tasks:delete\", ->\n loadTasks().then ->\n $rootscope.$broadcast(\"related-tasks:update\")\n\n $scope.$on \"related-tasks:add-new-clicked\", ->\n $scope.$broadcast(\"related-tasks:show-form\")\n\n taiga.bindOnce $scope, \"us\", (val) ->\n loadTasks()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\nmodule.directive(\"tgRelatedTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", RelatedTasksDirective])\n\nRelatedTaskAssignedToInlineEditionDirective = ($repo, $rootscope, popoverService) ->\n template = _.template(\"\"\"\n \" alt=\"<%- name %>\"/>\n
<%- name %>
\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n updateRelatedTask = (task) ->\n ctx = {name: \"Unassigned\", imgurl: \"/images/unnamed.png\"}\n member = $scope.usersById[task.assigned_to]\n if member\n ctx.imgurl = member.photo\n ctx.name = member.full_name_display\n\n $el.find(\".avatar\").html(template(ctx))\n $el.find(\".task-assignedto\").attr('title', ctx.name)\n\n $ctrl = $el.controller()\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition)\n notAutoSave = $scope.$eval($attrs.notAutoSave)\n autoSave = !notAutoSave\n\n updateRelatedTask(task)\n\n $el.on \"click\", \".task-assignedto\", (event) ->\n $rootscope.$broadcast(\"assigned-to:add\", task)\n\n taiga.bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions the click events are unbinded\n if project.my_permissions.indexOf(\"modify_task\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n $scope.$on \"assigned-to:added\", debounce 2000, (ctx, userId, updatedRelatedTask) =>\n if updatedRelatedTask.id == task.id\n updatedRelatedTask.assigned_to = userId\n if autoSave\n $repo.save(updatedRelatedTask).then ->\n $scope.$emit(\"related-tasks:assigned-to-changed\")\n updateRelatedTask(updatedRelatedTask)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgRelatedTaskAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", RelatedTaskAssignedToInlineEditionDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources.coffee\n###\n\ntaiga = @.taiga\n\nclass ResourcesService extends taiga.Service\n\nurls = {\n # Auth\n \"auth\": \"/auth\"\n \"auth-register\": \"/auth/register\"\n \"invitations\": \"/invitations\"\n\n # User\n \"users\": \"/users\"\n \"by_username\": \"/users/by_username\"\n \"users-password-recovery\": \"/users/password_recovery\"\n \"users-change-password-from-recovery\": \"/users/change_password_from_recovery\"\n \"users-change-password\": \"/users/change_password\"\n \"users-change-email\": \"/users/change_email\"\n \"users-cancel-account\": \"/users/cancel\"\n \"user-stats\": \"/users/%s/stats\"\n \"user-liked\": \"/users/%s/liked\"\n \"user-voted\": \"/users/%s/voted\"\n \"user-watched\": \"/users/%s/watched\"\n \"user-contacts\": \"/users/%s/contacts\"\n\n # User - Notification\n \"permissions\": \"/permissions\"\n \"notify-policies\": \"/notify-policies\"\n\n # User - Storage\n \"user-storage\": \"/user-storage\"\n\n # Memberships\n \"memberships\": \"/memberships\"\n \"bulk-create-memberships\": \"/memberships/bulk_create\"\n\n # Roles & Permissions\n \"roles\": \"/roles\"\n \"permissions\": \"/permissions\"\n\n # Resolver\n \"resolver\": \"/resolver\"\n\n # Project\n \"projects\": \"/projects\"\n \"project-templates\": \"/project-templates\"\n \"project-modules\": \"/projects/%s/modules\"\n \"bulk-update-projects-order\": \"/projects/bulk_update_order\"\n \"project-like\": \"/projects/%s/like\"\n \"project-unlike\": \"/projects/%s/unlike\"\n \"project-watch\": \"/projects/%s/watch\"\n \"project-unwatch\": \"/projects/%s/unwatch\"\n\n # Project Values - Choises\n \"userstory-statuses\": \"/userstory-statuses\"\n \"points\": \"/points\"\n \"task-statuses\": \"/task-statuses\"\n \"issue-statuses\": \"/issue-statuses\"\n \"issue-types\": \"/issue-types\"\n \"priorities\": \"/priorities\"\n \"severities\": \"/severities\"\n\n # Milestones/Sprints\n \"milestones\": \"/milestones\"\n\n # User stories\n \"userstories\": \"/userstories\"\n \"bulk-create-us\": \"/userstories/bulk_create\"\n \"bulk-update-us-backlog-order\": \"/userstories/bulk_update_backlog_order\"\n \"bulk-update-us-sprint-order\": \"/userstories/bulk_update_sprint_order\"\n \"bulk-update-us-kanban-order\": \"/userstories/bulk_update_kanban_order\"\n \"userstories-filters\": \"/userstories/filters_data\"\n \"userstory-upvote\": \"/userstories/%s/upvote\"\n \"userstory-downvote\": \"/userstories/%s/downvote\"\n \"userstory-watch\": \"/userstories/%s/watch\"\n \"userstory-unwatch\": \"/userstories/%s/unwatch\"\n\n # Tasks\n \"tasks\": \"/tasks\"\n \"bulk-create-tasks\": \"/tasks/bulk_create\"\n \"bulk-update-task-taskboard-order\": \"/tasks/bulk_update_taskboard_order\"\n \"task-upvote\": \"/tasks/%s/upvote\"\n \"task-downvote\": \"/tasks/%s/downvote\"\n \"task-watch\": \"/tasks/%s/watch\"\n \"task-unwatch\": \"/tasks/%s/unwatch\"\n\n # Issues\n \"issues\": \"/issues\"\n \"bulk-create-issues\": \"/issues/bulk_create\"\n \"issues-filters\": \"/issues/filters_data\"\n \"issue-upvote\": \"/issues/%s/upvote\"\n \"issue-downvote\": \"/issues/%s/downvote\"\n \"issue-watch\": \"/issues/%s/watch\"\n \"issue-unwatch\": \"/issues/%s/unwatch\"\n\n # Wiki pages\n \"wiki\": \"/wiki\"\n \"wiki-restore\": \"/wiki/%s/restore\"\n \"wiki-links\": \"/wiki-links\"\n\n # History\n \"history/us\": \"/history/userstory\"\n \"history/issue\": \"/history/issue\"\n \"history/task\": \"/history/task\"\n \"history/wiki\": \"/history/wiki\"\n\n # Attachments\n \"attachments/us\": \"/userstories/attachments\"\n \"attachments/issue\": \"/issues/attachments\"\n \"attachments/task\": \"/tasks/attachments\"\n \"attachments/wiki_page\": \"/wiki/attachments\"\n\n # Custom Attributess\n \"custom-attributes/userstory\": \"/userstory-custom-attributes\"\n \"custom-attributes/issue\": \"/issue-custom-attributes\"\n \"custom-attributes/task\": \"/task-custom-attributes\"\n\n # Custom Attributess - Values\n \"custom-attributes-values/userstory\": \"/userstories/custom-attributes-values\"\n \"custom-attributes-values/issue\": \"/issues/custom-attributes-values\"\n \"custom-attributes-values/task\": \"/tasks/custom-attributes-values\"\n\n # Webhooks\n \"webhooks\": \"/webhooks\"\n \"webhooks-test\": \"/webhooks/%s/test\"\n \"webhooklogs\": \"/webhooklogs\"\n \"webhooklogs-resend\": \"/webhooklogs/%s/resend\"\n\n # Reports - CSV\n \"userstories-csv\": \"/userstories/csv?uuid=%s\"\n \"tasks-csv\": \"/tasks/csv?uuid=%s\"\n \"issues-csv\": \"/issues/csv?uuid=%s\"\n\n # Timeline\n \"timeline-profile\": \"/timeline/profile\"\n \"timeline-user\": \"/timeline/user\"\n \"timeline-project\": \"/timeline/project\"\n\n # Search\n \"search\": \"/search\"\n\n # Export/Import\n \"exporter\": \"/exporter\"\n \"importer\": \"/importer/load_dump\"\n\n # Feedback\n \"feedback\": \"/feedback\"\n\n # locales\n \"locales\": \"/locales\"\n\n # Application tokens\n \"applications\": \"/applications\"\n \"application-tokens\": \"/application-tokens\"\n}\n\n# Initialize api urls service\ninitUrls = ($log, $urls) ->\n $log.debug \"Initialize api urls\"\n $urls.update(urls)\n\n# Initialize resources service populating it with methods\n# defined in separated files.\ninitResources = ($log, $rs) ->\n $log.debug \"Initialize resources\"\n providers = _.toArray(arguments).slice(2)\n\n for provider in providers\n provider($rs)\n\nmodule = angular.module(\"taigaResources\", [\"taigaBase\"])\nmodule.service(\"$tgResources\", ResourcesService)\n\n# Module entry point\nmodule.run([\"$log\", \"$tgUrls\", initUrls])\nmodule.run([\n \"$log\",\n \"$tgResources\",\n \"$tgProjectsResourcesProvider\",\n \"$tgCustomAttributesResourcesProvider\",\n \"$tgCustomAttributesValuesResourcesProvider\",\n \"$tgMembershipsResourcesProvider\",\n \"$tgNotifyPoliciesResourcesProvider\",\n \"$tgInvitationsResourcesProvider\",\n \"$tgRolesResourcesProvider\",\n \"$tgUserSettingsResourcesProvider\",\n \"$tgSprintsResourcesProvider\",\n \"$tgUserstoriesResourcesProvider\",\n \"$tgTasksResourcesProvider\",\n \"$tgIssuesResourcesProvider\",\n \"$tgWikiResourcesProvider\",\n \"$tgSearchResourcesProvider\",\n \"$tgAttachmentsResourcesProvider\",\n \"$tgMdRenderResourcesProvider\",\n \"$tgHistoryResourcesProvider\",\n \"$tgKanbanResourcesProvider\",\n \"$tgModulesResourcesProvider\",\n \"$tgWebhooksResourcesProvider\",\n \"$tgWebhookLogsResourcesProvider\",\n \"$tgLocalesResourcesProvider\",\n \"$tgUsersResourcesProvider\",\n initResources\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/search.coffee\n###\n\ntaiga = @.taiga\n\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nmixOf = @.taiga.mixOf\ndebounceLeading = @.taiga.debounceLeading\ntrim = @.taiga.trim\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaSearch\", [])\n\n\n#############################################################################\n## Search Controller\n#############################################################################\n\nclass SearchController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @q, @location, @appMetaService, @navUrls, @translate) ->\n @scope.sectionName = \"Search\"\n\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"SEARCH.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"SEARCH.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n # Search input watcher\n @scope.searchTerm = null\n loadSearchData = debounceLeading(100, (t) => @.loadSearchData(t))\n\n bindOnce @scope, \"projectId\", (projectId) =>\n if !@scope.searchResults && @scope.searchTerm\n @.loadSearchData()\n\n @scope.$watch \"searchTerm\", (term) =>\n if term != undefined && @scope.projectId\n @.loadSearchData(term)\n\n loadFilters: ->\n defered = @q.defer()\n defered.resolve()\n return defered.promise\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.issueStatusById = groupBy(project.issue_statuses, (x) -> x.id)\n @scope.taskStatusById = groupBy(project.task_statuses, (x) -> x.id)\n @scope.severityById = groupBy(project.severities, (x) -> x.id)\n @scope.priorityById = groupBy(project.priorities, (x) -> x.id)\n @scope.usStatusById = groupBy(project.us_statuses, (x) -> x.id)\n return project\n\n loadSearchData: (term = \"\") ->\n @scope.loading = true\n\n @._loadSearchData(term).then (data) =>\n if data\n @scope.searchResults = data\n @scope.loading = false\n\n _loadSearchData: (term = \"\") ->\n @.deferredAbort.resolve() if @.deferredAbort\n\n @.deferredAbort = @q.defer()\n\n @rs.search.do(@scope.projectId, term).then (data) =>\n @.deferredAbort.resolve(data)\n\n return @.deferredAbort.promise\n\n loadInitialData: ->\n return @.loadProject().then (project) =>\n @scope.projectId = project.id\n @.fillUsersAndRoles(project.members, project.roles)\n\nmodule.controller(\"SearchController\", SearchController)\n\n\n#############################################################################\n## Search box directive\n#############################################################################\n\nSearchBoxDirective = (projectService, $lightboxService, $navurls, $location, $route)->\n link = ($scope, $el, $attrs) ->\n project = null\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n text = $el.find(\"#search-text\").val()\n\n url = $navurls.resolve(\"project-search\", {project: project.get(\"slug\")})\n\n $scope.$apply ->\n $lightboxService.close($el)\n\n $location.path(url)\n $location.search(\"text\", text).path(url)\n $route.reload()\n\n\n openLightbox = () ->\n project = projectService.project\n\n $lightboxService.open($el).then () ->\n $el.find(\"#search-text\").focus()\n\n $el.on \"submit\", \"form\", submit\n\n openLightbox()\n\n return {\n templateUrl: \"search/lightbox-search.html\",\n link:link\n }\n\nSearchBoxDirective.$inject = [\n \"tgProjectService\",\n \"lightboxService\",\n \"$tgNavUrls\",\n \"$tgLocation\",\n \"$route\"\n]\n\nmodule.directive(\"tgSearchBox\", SearchBoxDirective)\n\n\n#############################################################################\n## Search Directive\n#############################################################################\n\nSearchDirective = ($log, $compile, $templatecache, $routeparams, $location) ->\n linkTable = ($scope, $el, $attrs, $ctrl) ->\n applyAutoTab = true\n activeSectionName = \"userstories\"\n tabsDom = $el.find(\"section.search-filter\")\n lastSearchResults = null\n\n getActiveSection = (data) ->\n maxVal = 0\n selectedSection = {}\n selectedSection.name = \"userstories\"\n selectedSection.value = []\n\n if !applyAutoTab\n selectedSection.name = activeSectionName\n selectedSection.value = data[activeSectionName]\n\n return selectedSection\n\n if data\n for name in [\"userstories\", \"issues\", \"tasks\", \"wikipages\"]\n value = data[name]\n\n if value.length > maxVal\n maxVal = value.length\n selectedSection.name = name\n selectedSection.value = value\n break;\n\n if maxVal == 0\n return selectedSection\n\n return selectedSection\n\n renderFilterTabs = (data) ->\n for name, value of data\n continue if name == \"count\"\n tabsDom.find(\"li.#{name} .num\").html(value.length)\n\n markSectionTabActive = (section) ->\n # Mark as active the item with max amount of results\n tabsDom.find(\"a.active\").removeClass(\"active\")\n tabsDom.find(\"li.#{section.name} a\").addClass(\"active\")\n\n applyAutoTab = false\n activeSectionName = section.name\n\n templates = {\n issues: $templatecache.get(\"search-issues\")\n tasks: $templatecache.get(\"search-tasks\")\n userstories: $templatecache.get(\"search-userstories\")\n wikipages: $templatecache.get(\"search-wikipages\")\n }\n\n renderTableContent = (section) ->\n oldElements = $el.find(\".search-result-table\").children()\n oldScope = oldElements.scope()\n\n if oldScope\n oldScope.$destroy()\n oldElements.remove()\n\n scope = $scope.$new()\n scope[section.name] = section.value\n\n template = angular.element.parseHTML(trim(templates[section.name]))\n element = $compile(template)(scope)\n $el.find(\".search-result-table\").html(element)\n\n $scope.$watch \"searchResults\", (data) ->\n lastSearchResults = data\n\n return if !lastSearchResults\n\n activeSection = getActiveSection(data)\n\n renderFilterTabs(data)\n\n renderTableContent(activeSection)\n markSectionTabActive(activeSection)\n\n $scope.$watch \"searchTerm\", (searchTerm) ->\n $location.search(\"text\", searchTerm) if searchTerm != undefined\n\n $el.on \"click\", \".search-filter li > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n sectionName = target.parent().data(\"name\")\n sectionData = if !lastSearchResults then [] else lastSearchResults[sectionName]\n\n section = {\n name: sectionName,\n value: sectionData\n }\n\n $scope.$apply ->\n renderTableContent(section)\n markSectionTabActive(section)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n linkTable($scope, $el, $attrs, $ctrl)\n\n searchText = $routeparams.text\n $scope.$watch \"projectId\", (projectId) ->\n $scope.searchTerm = searchText if projectId?\n\n return {link:link}\n\nmodule.directive(\"tgSearch\", [\"$log\", \"$compile\", \"$templateCache\", \"$routeParams\", \"$tgLocation\",\n SearchDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard.coffee\n###\n\nmodule = angular.module(\"taigaTaskboard\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/tasks.coffee\n###\n\nmodule = angular.module(\"taigaTasks\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/team.coffee\n###\n\nmodule = angular.module(\"taigaTeam\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings.coffee\n###\n\nmodule = angular.module(\"taigaUserSettings\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/userstories.coffee\n###\n\nmodule = angular.module(\"taigaUserStories\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/wiki.coffee\n###\n\nmodule = angular.module(\"taigaWiki\", [])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/analytics.coffee\n###\n\ntaiga = @.taiga\nmodule = angular.module(\"taigaCommon\")\n\n\nclass AnalyticsService extends taiga.Service\n @.$inject = [\"$rootScope\", \"$log\", \"$tgConfig\", \"$window\", \"$document\", \"$location\"]\n\n constructor: (@rootscope, @log, @config, @win, @doc, @location) ->\n @.initialized = false\n\n conf = @config.get(\"analytics\", {})\n\n @.accountId = conf.accountId\n @.pageEvent = conf.pageEvent or \"$routeChangeSuccess\"\n @.trackRoutes = conf.trackRoutes or true\n @.ignoreFirstPageLoad = conf.ignoreFirstPageLoad or false\n\n initialize: ->\n if not @.accountId\n @log.debug \"Analytics: no acount id provided. Disabling.\"\n return\n\n @.injectAnalytics()\n\n @win.ga(\"create\", @.accountId, \"auto\")\n @win.ga(\"require\", \"displayfeatures\")\n\n if @.trackRoutes and (not @.ignoreFirstPageLoad)\n @win.ga(\"send\", \"pageview\", @.getUrl())\n\n # activates page tracking\n if @.trackRoutes\n @rootscope.$on @.pageEvent, =>\n @.trackPage(@.getUrl(), \"Taiga\")\n\n @.initialized = true\n\n getUrl: ->\n return @location.path()\n\n injectAnalytics: ->\n fn = `(function(i,s,o,g,r,a,m){i[\"GoogleAnalyticsObject\"]=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);})`\n fn(window, document, \"script\", \"//www.google-analytics.com/analytics.js\", \"ga\")\n\n trackPage: (url, title) ->\n return if not @.initialized\n return if not @win.ga\n\n title = title or @doc[0].title\n @win.ga(\"send\", \"pageview\", {\n \"page\": url,\n \"title\": title\n })\n\n trackEvent: (category, action, label, value) ->\n return if not @.initialized\n return if not @win.ga\n\n @win.ga(\"send\", \"event\", category, action, label, value)\n\n\nmodule.service(\"$tgAnalytics\", AnalyticsService)\n\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/attachments.coffee\n###\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\nbindOnce = @.taiga.bindOnce\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaCommon\")\n\n\nclass AttachmentsController extends taiga.Controller\n @.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$q\", \"$translate\"]\n\n constructor: (@scope, @rootscope, @repo, @rs, @confirm, @q, @translate) ->\n bindMethods(@)\n @.type = null\n @.objectId = null\n @.projectId = null\n\n @.uploadingAttachments = []\n @.attachments = []\n @.attachmentsCount = 0\n @.deprecatedAttachmentsCount = 0\n @.showDeprecated = false\n\n initialize: (type, objectId) ->\n @.type = type\n @.objectId = objectId\n @.projectId = @scope.projectId\n\n loadAttachments: ->\n return @.attachments if not @.objectId\n\n urlname = \"attachments/#{@.type}\"\n\n return @rs.attachments.list(urlname, @.objectId, @.projectId).then (attachments) =>\n @.attachments = _.sortBy(attachments, \"order\")\n @.updateCounters()\n return attachments\n\n updateCounters: ->\n @.attachmentsCount = @.attachments.length\n @.deprecatedAttachmentsCount = _.filter(@.attachments, {is_deprecated: true}).length\n\n _createAttachment: (attachment) ->\n urlName = \"attachments/#{@.type}\"\n\n promise = @rs.attachments.create(urlName, @.projectId, @.objectId, attachment)\n promise = promise.then (data) =>\n data.isCreatedRightNow = true\n\n index = @.uploadingAttachments.indexOf(attachment)\n @.uploadingAttachments.splice(index, 1)\n @.attachments.push(data)\n @rootscope.$broadcast(\"attachment:create\")\n\n promise = promise.then null, (data) =>\n @scope.$emit(\"attachments:size-error\") if data.status == 413\n\n index = @.uploadingAttachments.indexOf(attachment)\n @.uploadingAttachments.splice(index, 1)\n\n message = @translate.instant(\"ATTACHMENT.ERROR_UPLOAD_ATTACHMENT\", {\n fileName: attachment.name, errorMessage: data.data._error_message})\n @confirm.notify(\"error\", message)\n return @q.reject(data)\n\n return promise\n\n # Create attachments in bulk\n createAttachments: (attachments) ->\n promises = _.map(attachments, (x) => @._createAttachment(x))\n return @q.all(promises).then =>\n @.updateCounters()\n\n # Add uploading attachment tracking.\n addUploadingAttachments: (attachments) ->\n @.uploadingAttachments = _.union(@.uploadingAttachments, attachments)\n\n # Change order of attachment in a ordered list.\n # This function is mainly executed after sortable ends.\n reorderAttachment: (attachment, newIndex) ->\n oldIndex = @.attachments.indexOf(attachment)\n return if oldIndex == newIndex\n\n @.attachments.splice(oldIndex, 1)\n @.attachments.splice(newIndex, 0, attachment)\n\n _.each(@.attachments, (x,i) -> x.order = i+1)\n\n # Persist one concrete attachment.\n # This function is mainly used when user clicks\n # to save button for save one unique attachment.\n updateAttachment: (attachment) ->\n onSuccess = =>\n @.updateCounters()\n @rootscope.$broadcast(\"attachment:edit\")\n\n onError = (response) =>\n $scope.$emit(\"attachments:size-error\") if response.status == 413\n @confirm.notify(\"error\")\n return @q.reject()\n\n return @repo.save(attachment).then(onSuccess, onError)\n\n # Persist all pending modifications on attachments.\n # This function is used mainly for persist the order\n # after sorting.\n saveAttachments: ->\n return @repo.saveAll(@.attachments).then null, =>\n for item in @.attachments\n item.revert()\n @.attachments = _.sortBy(@.attachments, \"order\")\n\n # Remove one concrete attachment.\n removeAttachment: (attachment) ->\n title = @translate.instant(\"ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT\")\n message = @translate.instant(\"ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT\", {fileName: attachment.name})\n\n return @confirm.askOnDelete(title, message).then (askResponse) =>\n onSuccess = =>\n askResponse.finish()\n index = @.attachments.indexOf(attachment)\n @.attachments.splice(index, 1)\n @.updateCounters()\n @rootscope.$broadcast(\"attachment:delete\")\n\n onError = =>\n askResponse.finish(false)\n message = @translate.instant(\"ATTACHMENT.ERROR_DELETE_ATTACHMENT\", {errorMessage: message})\n @confirm.notify(\"error\", null, message)\n return @q.reject()\n\n return @repo.remove(attachment).then(onSuccess, onError)\n\n # Function used in template for filter visible attachments\n filterAttachments: (item) ->\n if @.showDeprecated\n return true\n return not item.is_deprecated\n\n\nAttachmentsDirective = ($config, $confirm, $templates, $translate) ->\n template = $templates.get(\"attachment/attachments.html\", true)\n\n link = ($scope, $el, $attrs, $ctrls) ->\n $ctrl = $ctrls[0]\n $model = $ctrls[1]\n\n bindOnce $scope, $attrs.ngModel, (value) ->\n $ctrl.initialize($attrs.type, value.id)\n $ctrl.loadAttachments()\n\n tdom = $el.find(\"div.attachment-body.sortable\")\n tdom.sortable({\n items: \"div.single-attachment\"\n handle: \"a.settings.icon.icon-drag-v\"\n containment: \".attachments\"\n dropOnEmpty: true\n scroll: false\n tolerance: \"pointer\"\n placeholder: \"sortable-placeholder single-attachment\"\n })\n\n tdom.on \"sortstop\", (event, ui) ->\n attachment = ui.item.scope().attach\n newIndex = ui.item.index()\n\n $ctrl.reorderAttachment(attachment, newIndex)\n $ctrl.saveAttachments().then ->\n $scope.$emit(\"attachment:edit\")\n\n showSizeInfo = ->\n $el.find(\".size-info\").removeClass(\"hidden\")\n\n $scope.$on \"attachments:size-error\", ->\n showSizeInfo()\n\n $el.on \"change\", \".attachments-header input\", (event) ->\n files = _.toArray(event.target.files)\n\n return if files.length < 1\n\n $scope.$apply ->\n $ctrl.addUploadingAttachments(files)\n $ctrl.createAttachments(files)\n\n $el.on \"click\", \".more-attachments\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n $scope.$apply ->\n $ctrl.showDeprecated = not $ctrl.showDeprecated\n\n target.find(\"span.text\").addClass(\"hidden\")\n if $ctrl.showDeprecated\n target.find(\"span[data-type=hide]\").removeClass(\"hidden\")\n target.find(\"more-attachments-num\").addClass(\"hidden\")\n else\n target.find(\"span[data-type=show]\").removeClass(\"hidden\")\n target.find(\"more-attachments-num\").removeClass(\"hidden\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n templateFn = ($el, $attrs) ->\n maxFileSize = $config.get(\"maxUploadFileSize\", null)\n maxFileSize = sizeFormat(maxFileSize) if maxFileSize\n maxFileSizeMsg = if maxFileSize then $translate.instant(\"ATTACHMENT.MAX_UPLOAD_SIZE\", {maxFileSize: maxFileSize}) else \"\"\n ctx = {\n type: $attrs.type\n maxFileSize: maxFileSize\n maxFileSizeMsg: maxFileSizeMsg\n }\n return template(ctx)\n\n return {\n require: [\"tgAttachments\", \"ngModel\"]\n controller: AttachmentsController\n controllerAs: \"ctrl\"\n restrict: \"AE\"\n scope: true\n link: link\n template: templateFn\n }\n\nmodule.directive(\"tgAttachments\", [\"$tgConfig\", \"$tgConfirm\", \"$tgTemplate\", \"$translate\", AttachmentsDirective])\n\n\nAttachmentDirective = ($template, $compile, $translate, $rootScope) ->\n template = $template.get(\"attachment/attachment.html\", true)\n templateEdit = $template.get(\"attachment/attachment-edit.html\", true)\n\n link = ($scope, $el, $attrs, $ctrl) ->\n render = (attachment, edit=false) ->\n permissions = $scope.project.my_permissions\n modifyPermission = permissions.indexOf(\"modify_#{$ctrl.type}\") > -1\n\n ctx = {\n id: attachment.id\n name: attachment.name\n title : $translate.instant(\"ATTACHMENT.TITLE\", {\n fileName: attachment.name,\n date: moment(attachment.created_date).format($translate.instant(\"ATTACHMENT.DATE\"))})\n url: attachment.url\n size: sizeFormat(attachment.size)\n description: attachment.description\n isDeprecated: attachment.is_deprecated\n modifyPermission: modifyPermission\n }\n\n if edit\n html = $compile(templateEdit(ctx))($scope)\n else\n html = $compile(template(ctx))($scope)\n\n $el.html(html)\n\n if attachment.is_deprecated\n $el.addClass(\"deprecated\")\n $el.find(\"input:checkbox\").prop('checked', true)\n else\n $el.removeClass(\"deprecated\")\n\n saveAttachment = ->\n attachment.description = $el.find(\"input[name='description']\").val()\n attachment.is_deprecated = $el.find(\"input[name='is-deprecated']\").prop(\"checked\")\n attachment.isCreatedRightNow = false\n\n $scope.$apply ->\n $ctrl.updateAttachment(attachment).then ->\n render(attachment, false)\n\n ## Actions (on edit mode)\n $el.on \"click\", \"a.editable-settings.icon-floppy\", (event) ->\n event.preventDefault()\n saveAttachment()\n\n $el.on \"keyup\", \"input[name=description]\", (event) ->\n if event.keyCode == 13\n saveAttachment()\n else if event.keyCode == 27\n $scope.$apply -> render(attachment, false)\n\n $el.on \"click\", \"a.editable-settings.icon-delete\", (event) ->\n event.preventDefault()\n render(attachment, false)\n\n ## Actions (on view mode)\n $el.on \"click\", \"a.settings.icon-edit\", (event) ->\n event.preventDefault()\n render(attachment, true)\n $el.find(\"input[name='description']\").focus().select()\n\n $el.on \"click\", \"a.settings.icon-delete\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $ctrl.removeAttachment(attachment)\n\n $el.on \"click\", \"div.attachment-name a\", (event) ->\n if null != attachment.name.match(/\\.(jpe?g|png|gif|gifv|webm)/i)\n event.preventDefault()\n $scope.$apply ->\n $rootScope.$broadcast(\"attachment:preview\", attachment)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n # Bootstrap\n attachment = $scope.$eval($attrs.tgAttachment)\n render(attachment, attachment.isCreatedRightNow)\n if attachment.isCreatedRightNow\n $el.find(\"input[name='description']\").focus().select()\n\n return {\n link: link\n require: \"^tgAttachments\"\n restrict: \"AE\"\n }\n\nmodule.directive(\"tgAttachment\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$rootScope\", AttachmentDirective])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: bind-scope.coffee\n###\n\nmodule = angular.module(\"taigaCommon\")\n\nBindScope = (config) ->\n if !config.debugInfo\n jQuery.fn.scope = () -> this.data('scope')\n\n link = ($scope, $el) ->\n if !config.debugInfo\n $el\n .data('scope', $scope)\n .addClass('tg-scope')\n\n return {link: link}\n\nmodule.directive(\"tgBindScope\", [\"$tgConfig\", BindScope])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: compile-html.directive.coffee\n###\n\nCompileHtmlDirective = ($compile) ->\n link = (scope, element, attrs) ->\n scope.$watch attrs.tgCompileHtml, (newValue, oldValue) ->\n element.html(newValue)\n $compile(element.contents())(scope)\n\n return {\n link: link\n }\n\nCompileHtmlDirective.$inject = [\"$compile\"]\n\nangular.module(\"taigaCommon\").directive(\"tgCompileHtml\", CompileHtmlDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/components.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaCommon\")\n\n\n#############################################################################\n## Date Range Directive (used mainly for sprint date range)\n#############################################################################\n\nDateRangeDirective = ($translate) ->\n renderRange = ($el, first, second) ->\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\")\n initDate = moment(first).format(prettyDate)\n endDate = moment(second).format(prettyDate)\n $el.html(\"#{initDate}-#{endDate}\")\n\n link = ($scope, $el, $attrs) ->\n [first, second] = $attrs.tgDateRange.split(\",\")\n\n bindOnce $scope, first, (valFirst) ->\n bindOnce $scope, second, (valSecond) ->\n renderRange($el, valFirst, valSecond)\n\n return {link:link}\n\nmodule.directive(\"tgDateRange\", [\"$translate\", DateRangeDirective])\n\n\n#############################################################################\n## Date Selector Directive (using pikaday)\n#############################################################################\n\nDateSelectorDirective = ($rootscope, datePickerConfigService) ->\n link = ($scope, $el, $attrs, $model) ->\n selectedDate = null\n\n initialize = () ->\n datePickerConfig = datePickerConfigService.get()\n\n _.merge(datePickerConfig, {\n field: $el[0]\n onSelect: (date) =>\n selectedDate = date\n onOpen: =>\n $el.picker.setDate(selectedDate) if selectedDate?\n })\n\n $el.picker = new Pikaday(datePickerConfig)\n\n unbind = $rootscope.$on \"$translateChangeEnd\", (ctx) => initialize()\n\n $scope.$watch $attrs.ngModel, (val) ->\n initialize() if val? and not $el.picker\n $el.picker.setDate(val) if val?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n unbind()\n\n return {\n link: link\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgDateSelector\", [\"$rootScope\", \"tgDatePickerConfigService\", DateSelectorDirective])\n\n\n#############################################################################\n## Sprint Progress Bar Directive\n#############################################################################\n\nSprintProgressBarDirective = ->\n renderProgress = ($el, percentage, visual_percentage) ->\n if $el.hasClass(\".current-progress\")\n $el.css(\"width\", \"#{percentage}%\")\n else\n $el.find(\".current-progress\").css(\"width\", \"#{visual_percentage}%\")\n $el.find(\".number\").html(\"#{percentage} %\")\n\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgSprintProgressbar, (sprint) ->\n closedPoints = sprint.closed_points\n totalPoints = sprint.total_points\n percentage = 0\n percentage = Math.round(100 * (closedPoints/totalPoints)) if totalPoints != 0\n visual_percentage = 0\n #Visual hack for .current-progress bar\n visual_percentage = Math.round(98 * (closedPoints/totalPoints)) if totalPoints != 0\n\n renderProgress($el, percentage, visual_percentage)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgSprintProgressbar\", SprintProgressBarDirective)\n\n\n#############################################################################\n## Created-by display directive\n#############################################################################\n\nCreatedByDisplayDirective = ($template, $compile, $translate, $navUrls)->\n # Display the owner information (full name and photo) and the date of\n # creation of an object (like USs, tasks and issues).\n #\n # Example:\n # div.us-created-by(tg-created-by-display, ng-model=\"us\")\n #\n # Requirements:\n # - model object must have the attributes 'created_date' and\n # 'owner'(ng-model)\n # - scope.usersById object is required.\n\n template = $template.get(\"common/components/created-by.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (model) ->\n owner = model.owner_extra_info or {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n photo: \"/images/user-noimage.png\"\n }\n\n html = template({\n owner: owner\n url: if owner?.is_active then $navUrls.resolve(\"user-profile\", {username: owner.username}) else \"\"\n date: moment(model.created_date).format($translate.instant(\"COMMON.DATETIME\"))\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n bindOnce $scope, $attrs.ngModel, (model) ->\n render(model) if model?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgCreatedByDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\",\n CreatedByDisplayDirective])\n\n\n#############################################################################\n## Watchers directive\n#############################################################################\n\nWatchersDirective = ($rootscope, $confirm, $repo, $qqueue, $template, $compile, $translate) ->\n # You have to include a div with the tg-lb-watchers directive in the page\n # where use this directive\n template = $template.get(\"common/components/watchers.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project?.my_permissions?.indexOf($attrs.requiredPerm) != -1\n\n save = $qqueue.bindAdd (watchers) =>\n item = $model.$modelValue.clone()\n item.watchers = watchers\n $model.$setViewValue(item)\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n watchers = _.map(watchers, (watcherId) -> $scope.usersById[watcherId])\n renderWatchers(watchers)\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n $model.$modelValue.revert()\n\n deleteWatcher = $qqueue.bindAdd (watcherIds) =>\n item = $model.$modelValue.clone()\n item.watchers = watcherIds\n $model.$setViewValue(item)\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n watchers = _.map(item.watchers, (watcherId) -> $scope.usersById[watcherId])\n renderWatchers(watchers)\n $rootscope.$broadcast(\"object:updated\")\n promise.then null, ->\n item.revert()\n $confirm.notify(\"error\")\n\n\n renderWatchers = (watchers) ->\n ctx = {\n watchers: watchers\n isEditable: isEditable()\n }\n\n html = $compile(template(ctx))($scope)\n $el.html(html)\n\n $el.on \"click\", \".js-delete-watcher\", (event) ->\n event.preventDefault()\n return if not isEditable()\n target = angular.element(event.currentTarget)\n watcherId = target.data(\"watcher-id\")\n\n title = $translate.instant(\"COMMON.WATCHERS.TITLE_LIGHTBOX_DELETE_WARTCHER\")\n message = $scope.usersById[watcherId].full_name_display\n\n $confirm.askOnDelete(title, message).then (askResponse) =>\n askResponse.finish()\n\n watcherIds = _.clone($model.$modelValue.watchers, false)\n watcherIds = _.pull(watcherIds, watcherId)\n\n deleteWatcher(watcherIds)\n\n $el.on \"click\", \".js-add-watcher\", (event) ->\n event.preventDefault()\n return if not isEditable()\n $scope.$apply ->\n $rootscope.$broadcast(\"watcher:add\", $model.$modelValue)\n\n $scope.$on \"watcher:added\", (ctx, watcherId) ->\n watchers = _.clone($model.$modelValue.watchers, false)\n watchers.push(watcherId)\n watchers = _.uniq(watchers)\n\n save(watchers)\n\n $scope.$watch $attrs.ngModel, (item) ->\n return if not item?\n watchers = _.map(item.watchers, (watcherId) -> $scope.usersById[watcherId])\n renderWatchers(watchers)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link, require:\"ngModel\"}\n\nmodule.directive(\"tgWatchers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\",\n \"$translate\", WatchersDirective])\n\n\n#############################################################################\n## Assigned to directive\n#############################################################################\n\nAssignedToDirective = ($rootscope, $confirm, $repo, $loading, $qqueue, $template, $translate, $compile) ->\n # You have to include a div with the tg-lb-assignedto directive in the page\n # where use this directive\n template = $template.get(\"common/components/assigned-to.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project?.my_permissions?.indexOf($attrs.requiredPerm) != -1\n\n save = $qqueue.bindAdd (userId) =>\n $model.$modelValue.assigned_to = userId\n\n currentLoading = $loading()\n .target($el)\n .start()\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n renderAssignedTo($model.$modelValue)\n $rootscope.$broadcast(\"object:updated\")\n promise.then null, ->\n $model.$modelValue.revert()\n $confirm.notify(\"error\")\n currentLoading.finish()\n\n return promise\n\n renderAssignedTo = (issue) ->\n assignedToId = issue?.assigned_to\n assignedTo = if assignedToId? then $scope.usersById[assignedToId] else null\n\n ctx = {\n assignedTo: assignedTo\n isEditable: isEditable()\n }\n html = $compile(template(ctx))($scope)\n $el.html(html)\n\n $el.on \"click\", \".user-assigned\", (event) ->\n event.preventDefault()\n return if not isEditable()\n $scope.$apply ->\n $rootscope.$broadcast(\"assigned-to:add\", $model.$modelValue)\n\n $el.on \"click\", \".icon-delete\", (event) ->\n event.preventDefault()\n return if not isEditable()\n title = $translate.instant(\"COMMON.ASSIGNED_TO.CONFIRM_UNASSIGNED\")\n\n $confirm.ask(title).then (response) =>\n response.finish()\n $model.$modelValue.assigned_to = null\n save(null)\n\n $scope.$on \"assigned-to:added\", (ctx, userId, item) ->\n return if item.id != $model.$modelValue.id\n\n save(userId)\n\n $scope.$watch $attrs.ngModel, (instance) ->\n renderAssignedTo(instance)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link:link,\n require:\"ngModel\"\n }\n\nmodule.directive(\"tgAssignedTo\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$translate\", \"$compile\",\n AssignedToDirective])\n\n\n#############################################################################\n## Block Button directive\n#############################################################################\n\nBlockButtonDirective = ($rootscope, $loading, $template) ->\n template = $template.get(\"common/components/block-button.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_us\") != -1\n\n $scope.$watch $attrs.ngModel, (item) ->\n return if not item\n\n if isEditable()\n $el.find('.item-block').addClass('editable')\n\n if item.is_blocked\n $el.find('.item-block').hide()\n $el.find('.item-unblock').show()\n else\n $el.find('.item-block').show()\n $el.find('.item-unblock').hide()\n\n $el.on \"click\", \".item-block\", (event) ->\n event.preventDefault()\n $rootscope.$broadcast(\"block\", $model.$modelValue)\n\n $el.on \"click\", \".item-unblock\", (event) ->\n event.preventDefault()\n currentLoading = $loading()\n .target($el.find(\".item-unblock\"))\n .start()\n\n finish = ->\n currentLoading.finish()\n\n $rootscope.$broadcast(\"unblock\", $model.$modelValue, finish)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n template: template\n }\n\nmodule.directive(\"tgBlockButton\", [\"$rootScope\", \"$tgLoading\", \"$tgTemplate\", BlockButtonDirective])\n\n\n#############################################################################\n## Delete Button directive\n#############################################################################\n\nDeleteButtonDirective = ($log, $repo, $confirm, $location, $template) ->\n template = $template.get(\"common/components/delete-button.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n if not $attrs.onDeleteGoToUrl\n return $log.error \"DeleteButtonDirective requires on-delete-go-to-url set in scope.\"\n if not $attrs.onDeleteTitle\n return $log.error \"DeleteButtonDirective requires on-delete-title set in scope.\"\n\n $el.on \"click\", \".button-delete\", (event) ->\n title = $attrs.onDeleteTitle\n subtitle = $model.$modelValue.subject\n\n $confirm.askOnDelete(title, subtitle).then (askResponse) =>\n promise = $repo.remove($model.$modelValue)\n promise.then =>\n askResponse.finish()\n url = $scope.$eval($attrs.onDeleteGoToUrl)\n $location.path(url)\n promise.then null, =>\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n template: template\n }\n\nmodule.directive(\"tgDeleteButton\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgTemplate\", DeleteButtonDirective])\n\n\n#############################################################################\n## Editable subject directive\n#############################################################################\n\nEditableSubjectDirective = ($rootscope, $repo, $confirm, $loading, $qqueue, $template) ->\n template = $template.get(\"common/components/editable-subject.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n\n $scope.$on \"object:updated\", () ->\n $el.find('.edit-subject').hide()\n $el.find('.view-subject').show()\n\n isEditable = ->\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) != -1\n\n save = $qqueue.bindAdd (subject) =>\n $model.$modelValue.subject = subject\n\n currentLoading = $loading()\n .target($el.find('.save-container'))\n .start()\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n $el.find('.edit-subject').hide()\n $el.find('.view-subject').show()\n promise.then null, ->\n $confirm.notify(\"error\")\n promise.finally ->\n currentLoading.finish()\n\n return promise\n\n $el.click ->\n return if not isEditable()\n $el.find('.edit-subject').show()\n $el.find('.view-subject').hide()\n $el.find('input').focus()\n\n $el.on \"click\", \".save\", (e) ->\n e.preventDefault()\n\n subject = $scope.item.subject\n save(subject)\n\n $el.on \"keyup\", \"input\", (event) ->\n if event.keyCode == 13\n subject = $scope.item.subject\n save(subject)\n else if event.keyCode == 27\n $scope.$apply () => $model.$modelValue.revert()\n\n $el.find('div.edit-subject').hide()\n $el.find('div.view-subject').show()\n\n $el.find('div.edit-subject').hide()\n $el.find('div.view-subject span.edit').hide()\n\n $scope.$watch $attrs.ngModel, (value) ->\n return if not value\n $scope.item = value\n\n if not isEditable()\n $el.find('.view-subject .edit').remove()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n template: template\n }\n\nmodule.directive(\"tgEditableSubject\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\",\n \"$tgTemplate\", EditableSubjectDirective])\n\n\n#############################################################################\n## Editable description directive\n#############################################################################\n\nEditableDescriptionDirective = ($rootscope, $repo, $confirm, $compile, $loading, $selectedText, $qqueue, $template) ->\n template = $template.get(\"common/components/editable-description.html\")\n noDescriptionMegEditMode = $template.get(\"common/components/editable-description-msg-edit-mode.html\")\n noDescriptionMegReadMode = $template.get(\"common/components/editable-description-msg-read-mode.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n $el.find('.edit-description').hide()\n $el.find('.view-description .edit').hide()\n\n $scope.$on \"object:updated\", () ->\n $el.find('.edit-description').hide()\n $el.find('.view-description').show()\n\n isEditable = ->\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) != -1\n\n save = $qqueue.bindAdd (description) =>\n $model.$modelValue.description = description\n\n currentLoading = $loading()\n .target($el.find('.save-container'))\n .start()\n\n promise = $repo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n $el.find('.edit-description').hide()\n $el.find('.view-description').show()\n promise.then null, ->\n $confirm.notify(\"error\")\n promise.finally ->\n currentLoading.finish()\n\n $el.on \"mouseup\", \".view-description\", (event) ->\n # We want to dettect the a inside the div so we use the target and\n # not the currentTarget\n target = angular.element(event.target)\n return if not isEditable()\n return if target.is('a')\n return if $selectedText.get().length\n\n $el.find('.edit-description').show()\n $el.find('.view-description').hide()\n $el.find('textarea').focus()\n\n $el.on \"click\", \"a\", (event) ->\n target = angular.element(event.target)\n href = target.attr('href')\n if href.indexOf(\"#\") == 0\n event.preventDefault()\n $('body').scrollTop($(href).offset().top)\n\n $el.on \"click\", \".save\", (e) ->\n e.preventDefault()\n\n description = $scope.item.description\n save(description)\n\n $el.on \"keydown\", \"textarea\", (event) ->\n if event.keyCode == 27\n $scope.$apply () => $scope.item.revert()\n $el.find('.edit-description').hide()\n $el.find('.view-description').show()\n\n $scope.$watch $attrs.ngModel, (value) ->\n return if not value\n $scope.item = value\n\n if isEditable()\n $el.find('.view-description .edit').show()\n $el.find('.view-description .us-content').addClass('editable')\n $scope.noDescriptionMsg = $compile(noDescriptionMegEditMode)($scope)\n else\n $scope.noDescriptionMsg = $compile(noDescriptionMegReadMode)($scope)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n template: template\n }\n\nmodule.directive(\"tgEditableDescription\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\", \"$tgLoading\",\n \"$selectedText\", \"$tgQqueue\", \"$tgTemplate\", EditableDescriptionDirective])\n\n\n#############################################################################\n## Common list directives\n#############################################################################\n## NOTE: These directives are used in issues and search and are\n## completely bindonce, they only serves for visualization of data.\n#############################################################################\n\nListItemUsStatusDirective = ->\n link = ($scope, $el, $attrs) ->\n us = $scope.$eval($attrs.tgListitemUsStatus)\n bindOnce $scope, \"usStatusById\", (usStatusById) ->\n $el.html(usStatusById[us.status].name)\n\n return {link:link}\n\nmodule.directive(\"tgListitemUsStatus\", ListItemUsStatusDirective)\n\n\nListItemTaskStatusDirective = ->\n link = ($scope, $el, $attrs) ->\n task = $scope.$eval($attrs.tgListitemTaskStatus)\n bindOnce $scope, \"taskStatusById\", (taskStatusById) ->\n $el.html(taskStatusById[task.status].name)\n\n return {link:link}\n\nmodule.directive(\"tgListitemTaskStatus\", ListItemTaskStatusDirective)\n\n\nListItemAssignedtoDirective = ($template) ->\n template = $template.get(\"common/components/list-item-assigned-to-avatar.html\", true)\n\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"usersById\", (usersById) ->\n item = $scope.$eval($attrs.tgListitemAssignedto)\n ctx = {name: \"Unassigned\", imgurl: \"/images/unnamed.png\"}\n\n member = usersById[item.assigned_to]\n if member\n ctx.imgurl = member.photo\n ctx.name = member.full_name_display\n\n $el.html(template(ctx))\n\n return {link:link}\n\nmodule.directive(\"tgListitemAssignedto\", [\"$tgTemplate\", ListItemAssignedtoDirective])\n\n\nListItemIssueStatusDirective = ->\n link = ($scope, $el, $attrs) ->\n issue = $scope.$eval($attrs.tgListitemIssueStatus)\n bindOnce $scope, \"issueStatusById\", (issueStatusById) ->\n $el.html(issueStatusById[issue.status].name)\n\n return {link:link}\n\nmodule.directive(\"tgListitemIssueStatus\", ListItemIssueStatusDirective)\n\n\nListItemTypeDirective = ->\n link = ($scope, $el, $attrs) ->\n render = (issueTypeById, issue) ->\n type = issueTypeById[issue.type]\n domNode = $el.find(\".level\")\n domNode.css(\"background-color\", type.color)\n domNode.attr(\"title\", type.name)\n\n bindOnce $scope, \"issueTypeById\", (issueTypeById) ->\n issue = $scope.$eval($attrs.tgListitemType)\n render(issueTypeById, issue)\n\n $scope.$watch $attrs.tgListitemType, (issue) ->\n render($scope.issueTypeById, issue)\n\n return {\n link: link\n templateUrl: \"common/components/level.html\"\n }\n\nmodule.directive(\"tgListitemType\", ListItemTypeDirective)\n\n\nListItemPriorityDirective = ->\n link = ($scope, $el, $attrs) ->\n render = (priorityById, issue) ->\n priority = priorityById[issue.priority]\n domNode = $el.find(\".level\")\n domNode.css(\"background-color\", priority.color)\n domNode.attr(\"title\", priority.name)\n\n bindOnce $scope, \"priorityById\", (priorityById) ->\n issue = $scope.$eval($attrs.tgListitemPriority)\n render(priorityById, issue)\n\n $scope.$watch $attrs.tgListitemPriority, (issue) ->\n render($scope.priorityById, issue)\n\n return {\n link: link\n templateUrl: \"common/components/level.html\"\n }\n\nmodule.directive(\"tgListitemPriority\", ListItemPriorityDirective)\n\n\nListItemSeverityDirective = ->\n link = ($scope, $el, $attrs) ->\n render = (severityById, issue) ->\n severity = severityById[issue.severity]\n domNode = $el.find(\".level\")\n domNode.css(\"background-color\", severity.color)\n domNode.attr(\"title\", severity.name)\n\n bindOnce $scope, \"severityById\", (severityById) ->\n issue = $scope.$eval($attrs.tgListitemSeverity)\n render(severityById, issue)\n\n $scope.$watch $attrs.tgListitemSeverity, (issue) ->\n render($scope.severityById, issue)\n\n return {\n link: link\n templateUrl: \"common/components/level.html\"\n }\n\nmodule.directive(\"tgListitemSeverity\", ListItemSeverityDirective)\n\n\n#############################################################################\n## Progress bar directive\n#############################################################################\n\nTgProgressBarDirective = ($template) ->\n template = $template.get(\"common/components/progress-bar.html\", true)\n\n render = (el, percentage) ->\n el.html(template({percentage: percentage}))\n\n link = ($scope, $el, $attrs) ->\n element = angular.element($el)\n\n $scope.$watch $attrs.tgProgressBar, (percentage) ->\n percentage = _.max([0 , percentage])\n percentage = _.min([100, percentage])\n render($el, percentage)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgProgressBar\", [\"$tgTemplate\", TgProgressBarDirective])\n\n\n#############################################################################\n## Main title directive\n#############################################################################\n\nTgMainTitleDirective = ($translate) ->\n link = ($scope, $el, $attrs) ->\n $attrs.$observe \"i18nSectionName\", (i18nSectionName) ->\n $scope.sectionName = $translate.instant(i18nSectionName)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n templateUrl: \"common/components/main-title.html\"\n scope: {\n projectName : \"=projectName\"\n }\n }\n\nmodule.directive(\"tgMainTitle\", [\"$translate\", TgMainTitleDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/confirm.coffee\n###\n\ntaiga = @.taiga\ntimeout = @.taiga.timeout\ncancelTimeout = @.taiga.cancelTimeout\ndebounce = @.taiga.debounce\nbindMethods = @.taiga.bindMethods\n\nNOTIFICATION_MSG = {\n \"success\":\n title: \"NOTIFICATION.OK\"\n message: \"NOTIFICATION.SAVED\"\n \"error\":\n title: \"NOTIFICATION.WARNING\"\n message: \"NOTIFICATION.WARNING_TEXT\"\n \"light-error\":\n title: \"NOTIFICATION.WARNING\"\n message: \"NOTIFICATION.WARNING_TEXT\"\n}\n\n\nclass ConfirmService extends taiga.Service\n @.$inject = [\"$q\", \"lightboxService\", \"$tgLoading\", \"$translate\"]\n\n constructor: (@q, @lightboxService, @loading, @translate) ->\n bindMethods(@)\n\n hide: (el)->\n if el\n @lightboxService.close(el)\n\n el.off(\".confirm-dialog\")\n\n ask: (title, subtitle, message, lightboxSelector=\".lightbox-generic-ask\") ->\n defered = @q.defer()\n\n el = angular.element(lightboxSelector)\n\n # Render content\n el.find(\"h2.title\").html(title)\n el.find(\"span.subtitle\").html(subtitle)\n el.find(\"span.message\").html(message)\n\n # Assign event handlers\n el.on \"click.confirm-dialog\", \"a.button-green\", debounce 2000, (event) =>\n event.preventDefault()\n target = angular.element(event.currentTarget)\n currentLoading = @loading()\n .target(target)\n .start()\n defered.resolve {\n finish: (ok=true) =>\n currentLoading.finish()\n if ok\n @.hide(el)\n }\n\n el.on \"click.confirm-dialog\", \"a.button-red\", (event) =>\n event.preventDefault()\n defered.reject()\n @.hide(el)\n\n @lightboxService.open(el)\n\n return defered.promise\n\n askOnDelete: (title, message) ->\n return @.ask(title, @translate.instant(\"NOTIFICATION.ASK_DELETE\"), message)\n\n askChoice: (title, subtitle, choices, replacement, warning, lightboxSelector=\".lightbox-ask-choice\") ->\n defered = @q.defer()\n\n el = angular.element(lightboxSelector)\n\n # Render content\n el.find(\".title\").html(title)\n el.find(\".subtitle\").html(subtitle)\n\n if replacement\n el.find(\".replacement\").html(replacement)\n else\n el.find(\".replacement\").remove()\n\n if warning\n el.find(\".warning\").html(warning)\n else\n el.find(\".warning\").remove()\n\n choicesField = el.find(\".choices\")\n choicesField.html('')\n _.each choices, (value, key) ->\n choicesField.append(angular.element(\"\"))\n\n # Assign event handlers\n el.on \"click.confirm-dialog\", \"a.button-green\", debounce 2000, (event) =>\n event.preventDefault()\n target = angular.element(event.currentTarget)\n currentLoading = @loading()\n .target(target)\n .start()\n defered.resolve {\n selected: choicesField.val()\n finish: (ok=true) =>\n currentLoading.finish()\n if ok\n @.hide(el)\n }\n\n el.on \"click.confirm-dialog\", \"a.button-red\", (event) =>\n event.preventDefault()\n defered.reject()\n @.hide(el)\n\n @lightboxService.open(el)\n\n return defered.promise\n\n error: (message) ->\n defered = @q.defer()\n\n el = angular.element(\".lightbox-generic-error\")\n\n # Render content\n el.find(\"h2.title\").html(message)\n\n # Assign event handlers\n el.on \"click.confirm-dialog\", \"a.button-green\", (event) =>\n event.preventDefault()\n defered.resolve()\n @.hide(el)\n\n el.on \"click.confirm-dialog\", \"a.close\", (event) =>\n event.preventDefault()\n defered.resolve()\n @.hide(el)\n\n @lightboxService.open(el)\n\n return defered.promise\n\n success: (title, message) ->\n defered = @q.defer()\n\n el = angular.element(\".lightbox-generic-success\")\n\n # Render content\n el.find(\"h2.title\").html(title) if title\n el.find(\"p.message\").html(message) if message\n\n # Assign event handlers\n el.on \"click.confirm-dialog\", \"a.button-green\", (event) =>\n event.preventDefault()\n defered.resolve()\n @.hide(el)\n\n el.on \"click.confirm-dialog\", \"a.close\", (event) =>\n event.preventDefault()\n defered.resolve()\n @.hide(el)\n\n @lightboxService.open(el)\n\n return defered.promise\n\n loader: (title, message) ->\n el = angular.element(\".lightbox-generic-loading\")\n\n # Render content\n el.find(\"h2.title\").html(title) if title\n el.find(\"p.message\").html(message) if message\n\n return {\n start: => @lightboxService.open(el)\n stop: => @lightboxService.close(el)\n update: (status, title, message, percent) =>\n el.find(\"h2.title\").html(title) if title\n el.find(\"p.message\").html(message) if message\n\n if percent\n el.find(\".spin\").addClass(\"hidden\")\n el.find(\".progress-bar-wrapper\").removeClass(\"hidden\")\n el.find(\".progress-bar-wrapper > .bar\").width(percent + '%')\n el.find(\".progress-bar-wrapper > span\").html(percent + '%').css('left', (percent - 9) + '%' )\n else\n el.find(\".spin\").removeClass(\"hidden\")\n el.find(\".progress-bar-wrapper\").addClass(\"hidden\")\n }\n\n notify: (type, message, title, time) ->\n # NOTE: Typesi are: error, success, light-error\n # See partials/components/notification-message.jade)\n # Add default texts to NOTIFICATION_MSG for new notification types\n\n selector = \".notification-message-#{type}\"\n el = angular.element(selector)\n\n return if el.hasClass(\"active\")\n\n if title\n el.find(\"h4\").html(title)\n else\n el.find(\"h4\").html(@translate.instant(NOTIFICATION_MSG[type].title))\n\n if message\n el.find(\"p\").html(message)\n else\n el.find(\"p\").html(@translate.instant(NOTIFICATION_MSG[type].message))\n\n body = angular.element(\"body\")\n body.find(\".notification-message .notification-light\")\n .removeClass('active')\n .addClass('inactive')\n\n body.find(selector)\n .removeClass('inactive')\n .addClass('active')\n\n if @.tsem\n cancelTimeout(@.tsem)\n\n if !time\n time = if type == 'error' or type == 'light-error' then 3500 else 1500\n\n @.tsem = timeout time, =>\n body.find(selector)\n .removeClass('active')\n .addClass('inactive')\n\n delete @.tsem\n\n el.on \"click\", \".icon-delete, .close\", (event) =>\n body.find(selector)\n .removeClass('active')\n .addClass('inactive')\n\n\nmodule = angular.module(\"taigaCommon\")\nmodule.service(\"$tgConfirm\", ConfirmService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/custom-field-values.coffee\n###\n\ntaiga = @.taiga\nbindMethods = @.taiga.bindMethods\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\ngenerateHash = taiga.generateHash\n\nmodule = angular.module(\"taigaCommon\")\n\n# Custom attributes types (see taiga-back/taiga/projects/custom_attributes/choices.py)\nTEXT_TYPE = \"text\"\nMULTILINE_TYPE = \"multiline\"\nDATE_TYPE = \"date\"\n\n\nTYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n },\n {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n },\n {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }\n]\n\n\n\nclass CustomAttributesValuesController extends taiga.Controller\n @.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$q\"]\n\n constructor: (@scope, @rootscope, @repo, @rs, @confirm, @q) ->\n bindMethods(@)\n @.type = null\n @.objectId = null\n @.projectId = null\n @.customAttributes = []\n @.customAttributesValues = null\n\n initialize: (type, objectId) ->\n @.project = @scope.project\n @.type = type\n @.objectId = objectId\n @.projectId = @scope.projectId\n\n loadCustomAttributesValues: ->\n return @.customAttributesValues if not @.objectId\n return @rs.customAttributesValues[@.type].get(@.objectId).then (customAttributesValues) =>\n @.customAttributes = @.project[\"#{@.type}_custom_attributes\"]\n @.customAttributesValues = customAttributesValues\n return customAttributesValues\n\n getAttributeValue: (attribute) ->\n attributeValue = _.clone(attribute, false)\n attributeValue.value = @.customAttributesValues.attributes_values[attribute.id]\n return attributeValue\n\n updateAttributeValue: (attributeValue) ->\n onSuccess = =>\n @rootscope.$broadcast(\"custom-attributes-values:edit\")\n\n onError = (response) =>\n @confirm.notify(\"error\")\n return @q.reject()\n\n # We need to update the full array so angular understand the model is modified\n attributesValues = _.clone(@.customAttributesValues.attributes_values, true)\n attributesValues[attributeValue.id] = attributeValue.value\n @.customAttributesValues.attributes_values = attributesValues\n @.customAttributesValues.id = @.objectId\n return @repo.save(@.customAttributesValues).then(onSuccess, onError)\n\n\nCustomAttributesValuesDirective = ($templates, $storage) ->\n template = $templates.get(\"custom-attributes/custom-attributes-values.html\", true)\n collapsedHash = (type) ->\n return generateHash([\"custom-attributes-collapsed\", type])\n\n link = ($scope, $el, $attrs, $ctrls) ->\n $ctrl = $ctrls[0]\n $model = $ctrls[1]\n\n bindOnce $scope, $attrs.ngModel, (value) ->\n $ctrl.initialize($attrs.type, value.id)\n $ctrl.loadCustomAttributesValues()\n\n $el.on \"click\", \".custom-fields-header a\", ->\n hash = collapsedHash($attrs.type)\n collapsed = not($storage.get(hash) or false)\n $storage.set(hash, collapsed)\n if collapsed\n $el.find(\".custom-fields-header a\").removeClass(\"open\")\n $el.find(\".custom-fields-body\").removeClass(\"open\")\n else\n $el.find(\".custom-fields-header a\").addClass(\"open\")\n $el.find(\".custom-fields-body\").addClass(\"open\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n templateFn = ($el, $attrs) ->\n collapsed = $storage.get(collapsedHash($attrs.type)) or false\n\n return template({\n requiredEditionPerm: $attrs.requiredEditionPerm\n collapsed: collapsed\n })\n\n return {\n require: [\"tgCustomAttributesValues\", \"ngModel\"]\n controller: CustomAttributesValuesController\n controllerAs: \"ctrl\"\n restrict: \"AE\"\n scope: true\n link: link\n template: templateFn\n }\n\nmodule.directive(\"tgCustomAttributesValues\", [\"$tgTemplate\", \"$tgStorage\", \"$translate\",\n CustomAttributesValuesDirective])\n\n\nCustomAttributeValueDirective = ($template, $selectedText, $compile, $translate, datePickerConfigService) ->\n template = $template.get(\"custom-attributes/custom-attribute-value.html\", true)\n templateEdit = $template.get(\"custom-attributes/custom-attribute-value-edit.html\", true)\n\n link = ($scope, $el, $attrs, $ctrl) ->\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n\n render = (attributeValue, edit=false) ->\n if attributeValue.type is DATE_TYPE and attributeValue.value\n value = moment(attributeValue.value, \"YYYY-MM-DD\").format(prettyDate)\n else\n value = attributeValue.value\n editable = isEditable()\n\n ctx = {\n id: attributeValue.id\n name: attributeValue.name\n description: attributeValue.description\n value: value\n isEditable: editable\n type: attributeValue.type\n }\n\n if editable and (edit or not value)\n html = templateEdit(ctx)\n html = $compile(html)($scope)\n $el.html(html)\n\n if attributeValue.type == DATE_TYPE\n datePickerConfig = datePickerConfigService.get()\n _.merge(datePickerConfig, {\n field: $el.find(\"input[name=value]\")[0]\n onSelect: (date) =>\n selectedDate = date\n onOpen: =>\n $el.picker.setDate(selectedDate) if selectedDate?\n })\n $el.picker = new Pikaday(datePickerConfig)\n else\n html = template(ctx)\n html = $compile(html)($scope)\n $el.html(html)\n\n isEditable = ->\n permissions = $scope.project.my_permissions\n requiredEditionPerm = $attrs.requiredEditionPerm\n return permissions.indexOf(requiredEditionPerm) > -1\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n attributeValue.value = $el.find(\"input[name=value], textarea[name='value']\").val()\n if attributeValue.type is DATE_TYPE\n if moment(attributeValue.value, prettyDate).isValid()\n attributeValue.value = moment(attributeValue.value, prettyDate).format(\"YYYY-MM-DD\")\n else\n attributeValue.value = \"\"\n\n $scope.$apply ->\n $ctrl.updateAttributeValue(attributeValue).then ->\n render(attributeValue, false)\n\n setFocusAndSelectOnInputField = ->\n $el.find(\"input[name='value'], textarea[name='value']\").focus().select()\n\n # Bootstrap\n attributeValue = $scope.$eval($attrs.tgCustomAttributeValue)\n render(attributeValue)\n\n ## Actions (on view mode)\n $el.on \"click\", \".js-value-view-mode\", ->\n return if not isEditable()\n return if $selectedText.get().length\n render(attributeValue, true)\n setFocusAndSelectOnInputField()\n\n $el.on \"click\", \"a.icon-edit\", (event) ->\n event.preventDefault()\n render(attributeValue, true)\n setFocusAndSelectOnInputField()\n\n ## Actions (on edit mode)\n $el.on \"keyup\", \"input[name=value], textarea[name='value']\", (event) ->\n if event.keyCode is 13 and event.currentTarget.type isnt \"textarea\"\n submit(event)\n else if event.keyCode == 27\n render(attributeValue, false)\n\n $el.on \"submit\", \"form\", submit\n\n $el.on \"click\", \"a.icon-floppy\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n require: \"^tgCustomAttributesValues\"\n restrict: \"AE\"\n }\n\nmodule.directive(\"tgCustomAttributeValue\", [\"$tgTemplate\", \"$selectedText\", \"$compile\", \"$translate\",\n \"tgDatePickerConfigService\", CustomAttributeValueDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/estimation.coffee\n###\n\ntaiga = @.taiga\ngroupBy = @.taiga.groupBy\n\nmodule = angular.module(\"taigaCommon\")\n\n#############################################################################\n## User story estimation directive (for Lightboxes)\n#############################################################################\n\nLbUsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $template, $compile) ->\n # Display the points of a US and you can edit it.\n #\n # Example:\n # tg-lb-us-estimation-progress-bar(ng-model=\"us\")\n #\n # Requirements:\n # - Us object (ng-model)\n # - scope.project object\n\n link = ($scope, $el, $attrs, $model) ->\n $scope.$watch $attrs.ngModel, (us) ->\n if us\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project)\n estimationProcess.onSelectedPointForRole = (roleId, pointId) ->\n $scope.$apply ->\n $model.$setViewValue(us)\n\n\n estimationProcess.render = () ->\n ctx = {\n totalPoints: @calculateTotalPoints()\n roles: @calculateRoles()\n editable: @isEditable\n }\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\"\n template = $template.get(mainTemplate, true)\n html = template(ctx)\n html = $compile(html)($scope)\n @$el.html(html)\n\n estimationProcess.render()\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgLbUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgTemplate\", \"$compile\", LbUsEstimationDirective])\n\n\n#############################################################################\n## User story estimation directive\n#############################################################################\n\nUsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $qqueue, $template, $compile) ->\n # Display the points of a US and you can edit it.\n #\n # Example:\n # tg-us-estimation-progress-bar(ng-model=\"us\")\n #\n # Requirements:\n # - Us object (ng-model)\n # - scope.project object\n\n link = ($scope, $el, $attrs, $model) ->\n $scope.$watch $attrs.ngModel, (us) ->\n if us\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project)\n estimationProcess.onSelectedPointForRole = (roleId, pointId) ->\n @save(roleId, pointId).then ->\n $rootScope.$broadcast(\"object:updated\")\n\n estimationProcess.render = () ->\n ctx = {\n totalPoints: @calculateTotalPoints()\n roles: @calculateRoles()\n editable: @isEditable\n }\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\"\n template = $template.get(mainTemplate, true)\n html = template(ctx)\n html = $compile(html)($scope)\n @$el.html(html)\n\n estimationProcess.render()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\"\n UsEstimationDirective])\n\n\n#############################################################################\n## Estimations service\n#############################################################################\n\nEstimationsService = ($template, $qqueue, $repo, $confirm, $q) ->\n pointsTemplate = $template.get(\"common/estimation/us-estimation-points.html\", true)\n\n class EstimationProcess\n constructor: (@$el, @us, @project) ->\n @isEditable = @project.my_permissions.indexOf(\"modify_us\") != -1\n @roles = @project.roles\n @points = @project.points\n @pointsById = groupBy(@points, (x) -> x.id)\n @onSelectedPointForRole = (roleId, pointId) ->\n @render = () ->\n\n save: (roleId, pointId) ->\n deferred = $q.defer()\n $qqueue.add () =>\n onSuccess = =>\n deferred.resolve()\n $confirm.notify(\"success\")\n\n onError = =>\n $confirm.notify(\"error\")\n @us.revert()\n @render()\n deferred.reject()\n\n $repo.save(@us).then(onSuccess, onError)\n\n return deferred.promise\n\n calculateTotalPoints: () ->\n values = _.map(@us.points, (v, k) => @pointsById[v]?.value)\n\n if values.length == 0\n return \"0\"\n\n notNullValues = _.filter(values, (v) -> v?)\n if notNullValues.length == 0\n return \"?\"\n\n return _.reduce(notNullValues, (acc, num) -> acc + num)\n\n calculateRoles: () ->\n computableRoles = _.filter(@project.roles, \"computable\")\n roles = _.map computableRoles, (role) =>\n pointId = @us.points[role.id]\n pointObj = @pointsById[pointId]\n role = _.clone(role, true)\n role.points = if pointObj? and pointObj.name? then pointObj.name else \"?\"\n return role\n\n return roles\n\n bindClickEvents: =>\n @$el.on \"click\", \".total.clickable\", (event) =>\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n roleId = target.data(\"role-id\")\n @renderPointsSelector(roleId, target)\n target.siblings().removeClass('active')\n target.addClass('active')\n\n @$el.on \"click\", \".point\", (event) =>\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n roleId = target.data(\"role-id\")\n pointId = target.data(\"point-id\")\n @$el.find(\".popover\").popover().close()\n points = _.clone(@us.points, true)\n points[roleId] = pointId\n @us.points = points\n @render()\n @onSelectedPointForRole(roleId, pointId)\n\n renderPointsSelector: (roleId, target) ->\n points = _.map @points, (point) =>\n point = _.clone(point, true)\n point.selected = if @us.points[roleId] == point.id then false else true\n return point\n\n maxPointLength = 5\n horizontalList = _.some points, (point) => point.name.length > maxPointLength\n\n html = pointsTemplate({\"points\": points, roleId: roleId, horizontal: horizontalList})\n # Remove any previous state\n @$el.find(\".popover\").popover().close()\n @$el.find(\".pop-points-open\").remove()\n # Render into DOM and show the new created element\n if target?\n @$el.find(target).append(html)\n else\n @$el.append(html)\n\n @$el.find(\".pop-points-open\").popover().open ->\n $(this)\n .removeClass(\"active\")\n .closest(\"li\").removeClass(\"active\")\n\n @$el.find(\".pop-points-open\").show()\n\n pop = @$el.find(\".pop-points-open\")\n if pop.offset().top + pop.height() > document.body.clientHeight\n pop.addClass('pop-bottom')\n\n create = ($el, us, project) ->\n $el.unbind(\"click\")\n\n estimationProcess = new EstimationProcess($el, us, project)\n\n if estimationProcess.isEditable\n estimationProcess.bindClickEvents()\n\n return estimationProcess\n\n return {\n create: create\n }\n\nmodule.factory(\"$tgEstimationsService\", [\"$tgTemplate\", \"$tgQqueue\", \"$tgRepo\", \"$tgConfirm\", \"$q\", EstimationsService])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/filters.coffee\n###\n\ntaiga = @.taiga\n\nmodule = angular.module(\"taigaCommon\")\n\n\ndefaultFilter = ->\n return (value, defaultValue) ->\n if value is [null, undefined]\n return defaultValue\n return value\n\nmodule.filter(\"default\", defaultFilter)\n\n\nyesNoFilter = ($translate) ->\n return (value) ->\n if value\n return $translate.instant(\"COMMON.YES\")\n\n return $translate.instant(\"COMMON.NO\")\n\nmodule.filter(\"yesNo\", [\"$translate\", yesNoFilter])\n\n\nunslugify = ->\n return taiga.unslugify\n\nmodule.filter(\"unslugify\", unslugify)\n\n\nmomentFormat = ->\n return (input, format) ->\n if input\n return moment(input).format(format)\n return \"\"\n\nmodule.filter(\"momentFormat\", momentFormat)\n\n\nmomentFromNow = ->\n return (input, without_suffix) ->\n if input\n return moment(input).fromNow(without_suffix or false)\n return \"\"\n\nmodule.filter(\"momentFromNow\", momentFromNow)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/history.coffee\n###\n\ntaiga = @.taiga\ntrim = @.taiga.trim\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaCommon\")\n\nIGNORED_FIELDS = {\n \"userstories.userstory\": [\n \"watchers\", \"kanban_order\", \"backlog_order\", \"sprint_order\", \"finish_date\"\n ]\n \"tasks.task\": [\n \"watchers\", \"us_order\", \"taskboard_order\"\n ]\n}\n\n#############################################################################\n## History Directive (Main)\n#############################################################################\n\n\nclass HistoryController extends taiga.Controller\n @.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\"]\n\n constructor: (@scope, @repo, @rs) ->\n\n initialize: (type, objectId) ->\n @.type = type\n @.objectId = objectId\n\n loadHistory: (type, objectId) ->\n return @rs.history.get(type, objectId).then (history) =>\n for historyResult in history\n # If description was modified take only the description_html field\n if historyResult.values_diff.description_diff?\n historyResult.values_diff.description = historyResult.values_diff.description_diff\n\n delete historyResult.values_diff.description_html\n delete historyResult.values_diff.description_diff\n\n # If block note was modified take only the blocked_note_html field\n if historyResult.values_diff.blocked_note_diff?\n historyResult.values_diff.blocked_note = historyResult.values_diff.blocked_note_diff\n\n delete historyResult.values_diff.blocked_note_html\n delete historyResult.values_diff.blocked_note_diff\n\n @scope.history = history\n @scope.comments = _.filter(history, (item) -> item.comment != \"\")\n\n deleteComment: (type, objectId, activityId) ->\n return @rs.history.deleteComment(type, objectId, activityId).then => @.loadHistory(type, objectId)\n\n undeleteComment: (type, objectId, activityId) ->\n return @rs.history.undeleteComment(type, objectId, activityId).then => @.loadHistory(type, objectId)\n\n\nHistoryDirective = ($log, $loading, $qqueue, $template, $confirm, $translate, $compile, $navUrls, $rootScope) ->\n templateChangeDiff = $template.get(\"common/history/history-change-diff.html\", true)\n templateChangePoints = $template.get(\"common/history/history-change-points.html\", true)\n templateChangeGeneric = $template.get(\"common/history/history-change-generic.html\", true)\n templateChangeAttachment = $template.get(\"common/history/history-change-attachment.html\", true)\n templateChangeList = $template.get(\"common/history/history-change-list.html\", true)\n templateDeletedComment = $template.get(\"common/history/history-deleted-comment.html\", true)\n templateActivity = $template.get(\"common/history/history-activity.html\", true)\n templateBaseEntries = $template.get(\"common/history/history-base-entries.html\", true)\n templateBase = $template.get(\"common/history/history-base.html\", true)\n\n link = ($scope, $el, $attrs, $ctrl) ->\n # Bootstraping\n type = $attrs.type\n objectId = null\n\n showAllComments = false\n showAllActivity = false\n\n getPrettyDateFormat = ->\n return $translate.instant(\"ACTIVITY.DATETIME\")\n\n bindOnce $scope, $attrs.ngModel, (model) ->\n type = $attrs.type\n objectId = model.id\n\n $ctrl.initialize(type, objectId)\n $ctrl.loadHistory(type, objectId)\n\n # Helpers\n getHumanizedFieldName = (field) ->\n humanizedFieldNames = {\n subject : $translate.instant(\"ACTIVITY.FIELDS.SUBJECT\")\n name: $translate.instant(\"ACTIVITY.FIELDS.NAME\")\n description : $translate.instant(\"ACTIVITY.FIELDS.DESCRIPTION\")\n content: $translate.instant(\"ACTIVITY.FIELDS.CONTENT\")\n status: $translate.instant(\"ACTIVITY.FIELDS.STATUS\")\n is_closed : $translate.instant(\"ACTIVITY.FIELDS.IS_CLOSED\")\n finish_date : $translate.instant(\"ACTIVITY.FIELDS.FINISH_DATE\")\n type: $translate.instant(\"ACTIVITY.FIELDS.TYPE\")\n priority: $translate.instant(\"ACTIVITY.FIELDS.PRIORITY\")\n severity: $translate.instant(\"ACTIVITY.FIELDS.SEVERITY\")\n assigned_to : $translate.instant(\"ACTIVITY.FIELDS.ASSIGNED_TO\")\n watchers : $translate.instant(\"ACTIVITY.FIELDS.WATCHERS\")\n milestone : $translate.instant(\"ACTIVITY.FIELDS.MILESTONE\")\n user_story: $translate.instant(\"ACTIVITY.FIELDS.USER_STORY\")\n project: $translate.instant(\"ACTIVITY.FIELDS.PROJECT\")\n is_blocked: $translate.instant(\"ACTIVITY.FIELDS.IS_BLOCKED\")\n blocked_note: $translate.instant(\"ACTIVITY.FIELDS.BLOCKED_NOTE\")\n points: $translate.instant(\"ACTIVITY.FIELDS.POINTS\")\n client_requirement : $translate.instant(\"ACTIVITY.FIELDS.CLIENT_REQUIREMENT\")\n team_requirement : $translate.instant(\"ACTIVITY.FIELDS.TEAM_REQUIREMENT\")\n is_iocaine: $translate.instant(\"ACTIVITY.FIELDS.IS_IOCAINE\")\n tags: $translate.instant(\"ACTIVITY.FIELDS.TAGS\")\n attachments : $translate.instant(\"ACTIVITY.FIELDS.ATTACHMENTS\")\n is_deprecated: $translate.instant(\"ACTIVITY.FIELDS.IS_DEPRECATED\")\n blocked_note: $translate.instant(\"ACTIVITY.FIELDS.BLOCKED_NOTE\")\n is_blocked: $translate.instant(\"ACTIVITY.FIELDS.IS_BLOCKED\")\n order: $translate.instant(\"ACTIVITY.FIELDS.ORDER\")\n backlog_order: $translate.instant(\"ACTIVITY.FIELDS.BACKLOG_ORDER\")\n sprint_order: $translate.instant(\"ACTIVITY.FIELDS.SPRINT_ORDER\")\n kanban_order: $translate.instant(\"ACTIVITY.FIELDS.KANBAN_ORDER\")\n taskboard_order: $translate.instant(\"ACTIVITY.FIELDS.TASKBOARD_ORDER\")\n us_order: $translate.instant(\"ACTIVITY.FIELDS.US_ORDER\")\n }\n\n return humanizedFieldNames[field] or field\n\n countChanges = (comment) ->\n return _.keys(comment.values_diff).length\n\n formatChange = (change) ->\n if _.isArray(change)\n if change.length == 0\n return $translate.instant(\"ACTIVITY.VALUES.EMPTY\")\n return change.join(\", \")\n\n if change == \"\"\n return $translate.instant(\"ACTIVITY.VALUES.EMPTY\")\n\n if not change? or change == false\n return $translate.instant(\"ACTIVITY.VALUES.NO\")\n\n if change == true\n return $translate.instant(\"ACTIVITY.VALUES.YES\")\n\n return change\n\n # Render into string (operations without mutability)\n\n renderAttachmentEntry = (value) ->\n attachments = _.map value, (changes, type) ->\n if type == \"new\"\n return _.map changes, (change) ->\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.NEW_ATTACHMENT\"),\n diff: change.filename\n })\n else if type == \"deleted\"\n return _.map changes, (change) ->\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.DELETED_ATTACHMENT\"),\n diff: change.filename\n })\n else\n return _.map changes, (change) ->\n name = $translate.instant(\"ACTIVITY.UPDATED_ATTACHMENT\", {filename: change.filename})\n\n diff = _.map change.changes, (values, name) ->\n return {\n name: getHumanizedFieldName(name)\n from: formatChange(values[0])\n to: formatChange(values[1])\n }\n\n return templateChangeAttachment({name: name, diff: diff})\n\n return _.flatten(attachments).join(\"\\n\")\n\n renderCustomAttributesEntry = (value) ->\n customAttributes = _.map value, (changes, type) ->\n if type == \"new\"\n return _.map changes, (change) ->\n html = templateChangeGeneric({\n name: change.name,\n from: formatChange(\"\"),\n to: formatChange(change.value)\n })\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n else if type == \"deleted\"\n return _.map changes, (change) ->\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.DELETED_CUSTOM_ATTRIBUTE\")\n diff: change.name\n })\n else\n return _.map changes, (change) ->\n customAttrsChanges = _.map change.changes, (values) ->\n return templateChangeGeneric({\n name: change.name\n from: formatChange(values[0])\n to: formatChange(values[1])\n })\n return _.flatten(customAttrsChanges).join(\"\\n\")\n\n return _.flatten(customAttributes).join(\"\\n\")\n\n renderChangeEntry = (field, value) ->\n if field == \"description\"\n return templateChangeDiff({name: getHumanizedFieldName(\"description\"), diff: value[1]})\n else if field == \"blocked_note\"\n return templateChangeDiff({name: getHumanizedFieldName(\"blocked_note\"), diff: value[1]})\n else if field == \"points\"\n html = templateChangePoints({points: value})\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n else if field == \"attachments\"\n return renderAttachmentEntry(value)\n else if field == \"custom_attributes\"\n return renderCustomAttributesEntry(value)\n else if field in [\"tags\", \"watchers\"]\n name = getHumanizedFieldName(field)\n removed = _.difference(value[0], value[1])\n added = _.difference(value[1], value[0])\n html = templateChangeList({name:name, removed:removed, added: added})\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n else if field == \"assigned_to\"\n name = getHumanizedFieldName(field)\n from = formatChange(value[0] or $translate.instant(\"ACTIVITY.VALUES.UNASSIGNED\"))\n to = formatChange(value[1] or $translate.instant(\"ACTIVITY.VALUES.UNASSIGNED\"))\n return templateChangeGeneric({name:name, from:from, to: to})\n else\n name = getHumanizedFieldName(field)\n from = formatChange(value[0])\n to = formatChange(value[1])\n return templateChangeGeneric({name:name, from:from, to: to})\n\n renderChangeEntries = (change) ->\n changeModel = change.key.split(\":\")[0]\n if IGNORED_FIELDS[changeModel]?\n change.values_diff = _.removeKeys(change.values_diff, IGNORED_FIELDS[changeModel])\n\n return _.map(change.values_diff, (value, field) -> renderChangeEntry(field, value))\n\n renderChangesHelperText = (change) ->\n size = countChanges(change)\n return $translate.instant(\"ACTIVITY.SIZE_CHANGE\", {size: size}, 'messageformat')\n\n renderComment = (comment) ->\n if (comment.delete_comment_date or comment.delete_comment_user?.name)\n html = templateDeletedComment({\n deleteCommentDate: moment(comment.delete_comment_date).format(getPrettyDateFormat()) if comment.delete_comment_date\n deleteCommentUser: comment.delete_comment_user.name\n deleteComment: comment.comment_html\n activityId: comment.id\n canRestoreComment: ($scope.user and\n (comment.delete_comment_user.pk == $scope.user.id or\n $scope.project.my_permissions.indexOf(\"modify_project\") > -1))\n })\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n\n html = templateActivity({\n avatar: comment.user.photo\n userFullName: comment.user.name\n userProfileUrl: if comment.user.is_active then $navUrls.resolve(\"user-profile\", {username: comment.user.username}) else \"\"\n creationDate: moment(comment.created_at).format(getPrettyDateFormat())\n comment: comment.comment_html\n changesText: renderChangesHelperText(comment)\n changes: renderChangeEntries(comment)\n mode: \"comment\"\n deleteCommentDate: moment(comment.delete_comment_date).format(getPrettyDateFormat()) if comment.delete_comment_date\n deleteCommentUser: comment.delete_comment_user.name if comment.delete_comment_user?.name\n activityId: comment.id\n canDeleteComment: comment.user.pk == $scope.user?.id or $scope.project.my_permissions.indexOf(\"modify_project\") > -1\n })\n\n html = $compile(html)($scope)\n\n return html[0].outerHTML\n\n renderChange = (change) ->\n return templateActivity({\n avatar: change.user.photo\n userFullName: change.user.name\n userProfileUrl: if change.user.is_active then $navUrls.resolve(\"user-profile\", {username: change.user.username}) else \"\"\n creationDate: moment(change.created_at).format(getPrettyDateFormat())\n comment: change.comment_html\n changes: renderChangeEntries(change)\n changesText: \"\"\n mode: \"activity\"\n deleteCommentDate: moment(change.delete_comment_date).format(getPrettyDateFormat()) if change.delete_comment_date\n deleteCommentUser: change.delete_comment_user.name if change.delete_comment_user?.name\n activityId: change.id\n })\n\n renderHistory = (entries, totalEntries) ->\n if entries.length == totalEntries\n showMore = 0\n else\n showMore = totalEntries - entries.length\n\n html = templateBaseEntries({entries: entries, showMore:showMore})\n html = $compile(html)($scope)\n return html\n\n # Render into DOM (operations with dom mutability)\n\n renderComments = ->\n comments = $scope.comments or []\n totalComments = comments.length\n if not showAllComments\n comments = _.last(comments, 4)\n\n comments = _.map(comments, (x) -> renderComment(x))\n html = renderHistory(comments, totalComments)\n $el.find(\".comments-list\").html(html)\n\n renderActivity = ->\n changes = $scope.history or []\n totalChanges = changes.length\n if not showAllActivity\n changes = _.last(changes, 4)\n\n changes = _.map(changes, (x) -> renderChange(x))\n html = renderHistory(changes, totalChanges)\n $el.find(\".changes-list\").html(html)\n\n save = $qqueue.bindAdd (target) =>\n $scope.$broadcast(\"markdown-editor:submit\")\n\n $el.find(\".comment-list\").addClass(\"activeanimation\")\n\n currentLoading = $loading()\n .target(target)\n .start()\n\n onSuccess = ->\n $rootScope.$broadcast(\"comment:new\")\n\n $ctrl.loadHistory(type, objectId).finally ->\n currentLoading.finish()\n\n onError = ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n model = $scope.$eval($attrs.ngModel)\n\n $ctrl.repo.save(model).then(onSuccess, onError)\n\n # Watchers\n\n $scope.$watch(\"comments\", renderComments)\n $scope.$watch(\"history\", renderActivity)\n\n $scope.$on(\"object:updated\", -> $ctrl.loadHistory(type, objectId))\n\n # Events\n\n $el.on \"click\", \".add-comment button.button-green\", debounce 2000, (event) ->\n event.preventDefault()\n\n target = angular.element(event.currentTarget)\n save(target)\n\n $el.on \"click\", \"a\", (event) ->\n target = angular.element(event.target)\n href = target.attr('href')\n if href && href.indexOf(\"#\") == 0\n event.preventDefault()\n $('body').scrollTop($(href).offset().top)\n\n $el.on \"click\", \".show-more\", (event) ->\n event.preventDefault()\n\n target = angular.element(event.currentTarget)\n if target.parent().is(\".changes-list\")\n showAllActivity = not showAllActivity\n renderActivity()\n else\n showAllComments = not showAllComments\n renderComments()\n\n $el.on \"click\", \".show-deleted-comment\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.parents('.activity-single').find('.hide-deleted-comment').show()\n target.parents('.activity-single').find('.show-deleted-comment').hide()\n target.parents('.activity-single').find('.comment-body').show()\n\n $el.on \"click\", \".hide-deleted-comment\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.parents('.activity-single').find('.hide-deleted-comment').hide()\n target.parents('.activity-single').find('.show-deleted-comment').show()\n target.parents('.activity-single').find('.comment-body').hide()\n\n $el.on \"click\", \".changes-title\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.parent().find(\".change-entry\").toggleClass(\"active\")\n\n $el.on \"focus\", \".add-comment textarea\", (event) ->\n $(this).addClass('active')\n\n $el.on \"click\", \".history-tabs li a\", (event) ->\n target = angular.element(event.currentTarget)\n\n $el.find(\".history-tabs li a\").removeClass(\"active\")\n target.addClass(\"active\")\n\n $el.find(\".history section\").addClass(\"hidden\")\n $el.find(\".history section.#{target.data('section-class')}\").removeClass(\"hidden\")\n\n $el.on \"click\", \".comment-delete\", debounce 2000, (event) ->\n event.preventDefault()\n\n target = angular.element(event.currentTarget)\n activityId = target.data('activity-id')\n $ctrl.deleteComment(type, objectId, activityId)\n\n $el.on \"click\", \".comment-restore\", debounce 2000, (event) ->\n event.preventDefault()\n\n target = angular.element(event.currentTarget)\n activityId = target.data('activity-id')\n $ctrl.undeleteComment(type, objectId, activityId)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n templateFn = ($el, $attrs) ->\n html = templateBase({ngmodel: $attrs.ngModel, type: $attrs.type, mode: $attrs.mode})\n\n return html\n\n return {\n controller: HistoryController\n template: templateFn\n restrict: \"AE\"\n link: link\n # require: [\"ngModel\", \"tgHistory\"]\n }\n\n\nmodule.directive(\"tgHistory\", [\"$log\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$tgConfirm\", \"$translate\",\n \"$compile\", \"$tgNavUrls\", \"$rootScope\", HistoryDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/importer.coffee\n###\n\nmodule = angular.module(\"taigaCommon\")\n\n\nImportProjectButtonDirective = ($rs, $confirm, $location, $navUrls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $el.on \"click\", \".import-project-button\", (event) ->\n event.preventDefault()\n $el.find(\"input.import-file\").val(\"\")\n $el.find(\"input.import-file\").trigger(\"click\")\n\n $el.on \"change\", \"input.import-file\", (event) ->\n event.preventDefault()\n file = event.target.files[0]\n return if not file\n\n loader = $confirm.loader($translate.instant(\"PROJECT.IMPORT.UPLOADING_FILE\"))\n\n onSuccess = (result) ->\n loader.stop()\n if result.status == 202 # Async mode\n title = $translate.instant(\"PROJECT.IMPORT.ASYNC_IN_PROGRESS_TITLE\")\n message = $translate.instant(\"PROJECT.IMPORT.ASYNC_IN_PROGRESS_MESSAGE\")\n $confirm.success(title, message)\n\n else # result.status == 201 # Sync mode\n ctx = {project: result.data.slug}\n $location.path($navUrls.resolve(\"project-admin-project-profile-details\", ctx))\n msg = $translate.instant(\"PROJECT.IMPORT.SYNC_SUCCESS\")\n $confirm.notify(\"success\", msg)\n\n onError = (result) ->\n loader.stop()\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR\")\n\n if result.status == 429 # TOO MANY REQUESTS\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_TOO_MANY_REQUEST\")\n else if result.data?._error_message\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MESSAGE\", {error_message: result.data._error_message})\n $confirm.notify(\"error\", errorMsg)\n\n loader.start()\n $rs.projects.import(file, loader.update).then(onSuccess, onError)\n\n return {link: link}\n\nmodule.directive(\"tgImportProjectButton\", [\"$tgResources\", \"$tgConfirm\", \"$location\", \"$tgNavUrls\", \"$translate\",\n ImportProjectButtonDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/lightboxes.coffee\n###\n\nmodule = angular.module(\"taigaCommon\")\n\nbindOnce = @.taiga.bindOnce\ntimeout = @.taiga.timeout\ndebounce = @.taiga.debounce\n\n#############################################################################\n## Common Lightbox Services\n#############################################################################\n\n# the lightboxContent hide/show doesn't have sense because is an IE hack\nclass LightboxService extends taiga.Service\n constructor: (@animationFrame, @q) ->\n\n open: ($el) ->\n defered = @q.defer()\n\n lightboxContent = $el.children().not(\".close\")\n lightboxContent.hide()\n\n @animationFrame.add ->\n $el.css('display', 'flex')\n\n @animationFrame.add ->\n $el.addClass(\"open\")\n\n @animationFrame.add ->\n $el.find('input,textarea').first().focus()\n\n @animationFrame.add =>\n lightboxContent.show()\n defered.resolve()\n\n docEl = angular.element(document)\n docEl.on \"keydown.lightbox\", (e) =>\n code = if e.keyCode then e.keyCode else e.which\n @.close($el) if code == 27\n\n return defered.promise\n\n close: ($el) ->\n docEl = angular.element(document)\n docEl.off(\".lightbox\")\n docEl.off(\".keyboard-navigation\") # Hack: to fix problems in the WYSIWYG textareas when press ENTER\n $el.one \"transitionend\", =>\n $el.removeAttr('style')\n $el.removeClass(\"open\").removeClass('close')\n\n $el.addClass('close')\n\n if $el.hasClass(\"remove-on-close\")\n scope = $el.data(\"scope\")\n scope.$destroy()\n $el.remove()\n\n closeAll: ->\n docEl = angular.element(document)\n for lightboxEl in docEl.find(\".lightbox.open\")\n @.close($(lightboxEl))\n\n\nmodule.service(\"lightboxService\", [\"animationFrame\", \"$q\", LightboxService])\n\n\nclass LightboxKeyboardNavigationService extends taiga.Service\n stop: ->\n docEl = angular.element(document)\n docEl.off(\".keyboard-navigation\")\n\n dispatch: ($el, code) ->\n activeElement = $el.find(\".active\")\n\n # Key: enter\n if code == 13\n if $el.find(\".watcher-single\").length == 1\n $el.find('.watcher-single:first').trigger(\"click\")\n else\n activeElement.trigger(\"click\")\n\n # Key: down\n else if code == 40\n if not activeElement.length\n $el.find('.watcher-single:first').addClass('active')\n else\n next = activeElement.next('.watcher-single')\n if next.length\n activeElement.removeClass('active')\n next.addClass('active')\n # Key: up\n else if code == 38\n if not activeElement.length\n $el.find('.watcher-single:last').addClass('active')\n else\n prev = activeElement.prev('.watcher-single')\n\n if prev.length\n activeElement.removeClass('active')\n prev.addClass('active')\n\n init: ($el) ->\n @stop()\n docEl = angular.element(document)\n docEl.on \"keydown.keyboard-navigation\", (event) =>\n code = if event.keyCode then event.keyCode else event.which\n if code == 40 || code == 38 || code == 13\n event.preventDefault()\n @.dispatch($el, code)\n\nmodule.service(\"lightboxKeyboardNavigationService\", LightboxKeyboardNavigationService)\n\n\n#############################################################################\n## Generic Lighthbox Directive\n#############################################################################\n\n# This adds generic behavior to all blocks with lightbox class like\n# close button event handlers.\n\nLightboxDirective = (lightboxService) ->\n link = ($scope, $el, $attrs) ->\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n lightboxService.close($el)\n\n return {restrict: \"C\", link: link}\n\nmodule.directive(\"lightbox\", [\"lightboxService\", LightboxDirective])\n\n#############################################################################\n## Block Lightbox Directive\n#############################################################################\n\n# Issue/Userstory blocking message lightbox directive.\n\nBlockLightboxDirective = ($rootscope, $tgrepo, $confirm, lightboxService, $loading, $qqueue, $translate) ->\n link = ($scope, $el, $attrs, $model) ->\n title = $translate.instant($attrs.title)\n $el.find(\"h2.title\").text(title)\n\n unblock = $qqueue.bindAdd (item, finishCallback) =>\n promise = $tgrepo.save(item)\n promise.then ->\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n $model.$setViewValue(item)\n finishCallback()\n\n promise.then null, ->\n $confirm.notify(\"error\")\n item.revert()\n $model.$setViewValue(item)\n\n promise.finally ->\n finishCallback()\n\n return promise\n\n block = $qqueue.bindAdd (item) =>\n $model.$setViewValue(item)\n\n currentLoading = $loading()\n .target($el.find(\".button-green\"))\n .start()\n\n promise = $tgrepo.save($model.$modelValue)\n promise.then ->\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n $confirm.notify(\"error\")\n item.revert()\n $model.$setViewValue(item)\n\n promise.finally ->\n currentLoading.finish()\n lightboxService.close($el)\n\n $scope.$on \"block\", ->\n $el.find(\".reason\").val($model.$modelValue.blocked_note)\n lightboxService.open($el)\n\n $scope.$on \"unblock\", (event, model, finishCallback) =>\n item = $model.$modelValue.clone()\n item.is_blocked = false\n item.blocked_note = \"\"\n\n unblock(item, finishCallback)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $el.on \"click\", \".button-green\", (event) ->\n event.preventDefault()\n\n item = $model.$modelValue.clone()\n item.is_blocked = true\n item.blocked_note = $el.find(\".reason\").val()\n\n block(item)\n\n return {\n templateUrl: \"common/lightbox/lightbox-block.html\"\n link: link\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgLbBlock\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"lightboxService\", \"$tgLoading\", \"$tgQqueue\", \"$translate\", BlockLightboxDirective])\n\n\n#############################################################################\n## Generic Lightbox Blocking-Message Input Directive\n#############################################################################\n\nBlockingMessageInputDirective = ($log, $template, $compile) ->\n template = $template.get(\"common/lightbox/lightbox-blocking-message-input.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n if not $attrs.watch\n return $log.error \"No watch attribute on tg-blocking-message-input directive\"\n\n $scope.$watch $attrs.watch, (value) ->\n if value is not undefined and value == true\n $el.find(\".blocked-note\").removeClass(\"hidden\")\n else\n $el.find(\".blocked-note\").addClass(\"hidden\")\n\n templateFn = ($el, $attrs) ->\n return template({ngmodel: $attrs.ngModel})\n\n return {\n template: templateFn\n link: link\n require: \"ngModel\"\n restrict: \"EA\"\n }\n\nmodule.directive(\"tgBlockingMessageInput\", [\"$log\", \"$tgTemplate\", \"$compile\", BlockingMessageInputDirective])\n\n\n#############################################################################\n## Create/Edit Userstory Lightbox Directive\n#############################################################################\n\nCreateEditUserstoryDirective = ($repo, $model, $rs, $rootScope, lightboxService, $loading, $translate) ->\n link = ($scope, $el, attrs) ->\n $scope.isNew = true\n\n $scope.$on \"usform:new\", (ctx, projectId, status, statusList) ->\n $scope.isNew = true\n $scope.usStatusList = statusList\n\n $scope.us = $model.make_model(\"userstories\", {\n project: projectId\n points : {}\n status: status\n is_archived: false\n tags: []\n })\n\n # Update texts for creation\n $el.find(\".button-green\").html($translate.instant(\"COMMON.CREATE\"))\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.NEW_US\"))\n $el.find(\".tag-input\").val(\"\")\n\n $el.find(\".blocked-note\").addClass(\"hidden\")\n $el.find(\"label.blocked\").removeClass(\"selected\")\n $el.find(\"label.team-requirement\").removeClass(\"selected\")\n $el.find(\"label.client-requirement\").removeClass(\"selected\")\n\n lightboxService.open($el)\n\n $scope.$on \"usform:edit\", (ctx, us) ->\n $scope.us = us\n $scope.isNew = false\n\n # Update texts for edition\n $el.find(\".button-green\").html($translate.instant(\"COMMON.SAVE\"))\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.EDIT_US\"))\n $el.find(\".tag-input\").val(\"\")\n\n # Update requirement info (team, client or blocked)\n if us.is_blocked\n $el.find(\".blocked-note\").removeClass(\"hidden\")\n $el.find(\"label.blocked\").addClass(\"selected\")\n else\n $el.find(\".blocked-note\").addClass(\"hidden\")\n $el.find(\"label.blocked\").removeClass(\"selected\")\n\n if us.team_requirement\n $el.find(\"label.team-requirement\").addClass(\"selected\")\n else\n $el.find(\"label.team-requirement\").removeClass(\"selected\")\n if us.client_requirement\n $el.find(\"label.client-requirement\").addClass(\"selected\")\n else\n $el.find(\"label.client-requirement\").removeClass(\"selected\")\n\n lightboxService.open($el)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n if $scope.isNew\n promise = $repo.create(\"userstories\", $scope.us)\n broadcastEvent = \"usform:new:success\"\n else\n promise = $repo.save($scope.us)\n broadcastEvent = \"usform:edit:success\"\n\n promise.then (data) ->\n currentLoading.finish()\n lightboxService.close($el)\n $rootScope.$broadcast(broadcastEvent, data)\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $scope.us.revert()\n lightboxService.close($el)\n\n $el.keydown (event) ->\n code = if event.keyCode then event.keyCode else event.which\n if code == 27\n lightboxService.close($el)\n $scope.$apply ->\n $scope.us.revert()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgLbCreateEditUserstory\", [\n \"$tgRepo\",\n \"$tgModel\",\n \"$tgResources\",\n \"$rootScope\",\n \"lightboxService\",\n \"$tgLoading\",\n \"$translate\",\n CreateEditUserstoryDirective\n])\n\n\n#############################################################################\n## Creare Bulk Userstories Lightbox Directive\n#############################################################################\n\nCreateBulkUserstoriesDirective = ($repo, $rs, $rootscope, lightboxService, $loading) ->\n link = ($scope, $el, attrs) ->\n $scope.$on \"usform:bulk\", (ctx, projectId, status) ->\n $scope.new = {\n projectId: projectId\n statusId: status\n bulk: \"\"\n }\n lightboxService.open($el)\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley({onlyOneErrorElement: true})\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $rs.userstories.bulkCreate($scope.new.projectId, $scope.new.statusId, $scope.new.bulk)\n promise.then (result) ->\n currentLoading.finish()\n $rootscope.$broadcast(\"usform:bulk:success\", result)\n lightboxService.close($el)\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgLbCreateBulkUserstories\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n \"lightboxService\",\n \"$tgLoading\",\n CreateBulkUserstoriesDirective\n])\n\n\n#############################################################################\n## AssignedTo Lightbox Directive\n#############################################################################\n\nAssignedToLightboxDirective = (lightboxService, lightboxKeyboardNavigationService, $template, $compile) ->\n link = ($scope, $el, $attrs) ->\n selectedUser = null\n selectedItem = null\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true)\n\n normalizeString = (string) ->\n normalizedString = string\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\")\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\")\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\")\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\")\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\")\n return normalizedString\n\n filterUsers = (text, user) ->\n username = user.full_name_display.toUpperCase()\n username = normalizeString(username)\n text = text.toUpperCase()\n text = normalizeString(text)\n return _.contains(username, text)\n\n render = (selected, text) ->\n users = _.clone($scope.activeUsers, true)\n users = _.reject(users, {\"id\": selected.id}) if selected?\n users = _.filter(users, _.partial(filterUsers, text)) if text?\n\n ctx = {\n selected: selected\n users: _.first(users, 5)\n showMore: users.length > 5\n }\n\n html = usersTemplate(ctx)\n html = $compile(html)($scope)\n\n $el.find(\".assigned-to-list\").html(html)\n\n closeLightbox = () ->\n lightboxKeyboardNavigationService.stop()\n lightboxService.close($el)\n\n $scope.$on \"assigned-to:add\", (ctx, item) ->\n selectedItem = item\n assignedToId = item.assigned_to\n selectedUser = $scope.usersById[assignedToId]\n\n render(selectedUser)\n lightboxService.open($el).then ->\n $el.find('input').focus()\n lightboxKeyboardNavigationService.init($el)\n\n $scope.$watch \"usersSearch\", (searchingText) ->\n if searchingText?\n render(selectedUser, searchingText)\n $el.find('input').focus()\n\n $el.on \"click\", \".user-list-single\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n closeLightbox()\n\n $scope.$apply ->\n $scope.$broadcast(\"assigned-to:added\", target.data(\"user-id\"), selectedItem)\n $scope.usersSearch = null\n\n $el.on \"click\", \".remove-assigned-to\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n\n closeLightbox()\n\n $scope.$apply ->\n $scope.usersSearch = null\n $scope.$broadcast(\"assigned-to:added\", null, selectedItem)\n\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n\n closeLightbox()\n\n $scope.$apply ->\n $scope.usersSearch = null\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n templateUrl: \"common/lightbox/lightbox-assigned-to.html\"\n link:link\n }\n\n\nmodule.directive(\"tgLbAssignedto\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", AssignedToLightboxDirective])\n\n\n#############################################################################\n## Watchers Lightbox directive\n#############################################################################\n\nWatchersLightboxDirective = ($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile) ->\n link = ($scope, $el, $attrs) ->\n selectedItem = null\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true)\n\n # Get prefiltered users by text\n # and without now watched users.\n getFilteredUsers = (text=\"\") ->\n _filterUsers = (text, user) ->\n if selectedItem && _.find(selectedItem.watchers, (x) -> x == user.id)\n return false\n\n username = user.full_name_display.toUpperCase()\n text = text.toUpperCase()\n return _.contains(username, text)\n\n users = _.clone($scope.activeUsers, true)\n users = _.filter(users, _.partial(_filterUsers, text))\n return users\n\n # Render the specific list of users.\n render = (users) ->\n ctx = {\n selected: false\n users: _.first(users, 5)\n showMore: users.length > 5\n }\n\n html = usersTemplate(ctx)\n html = $compile(html)($scope)\n $el.find(\".ticket-watchers\").html(html)\n\n closeLightbox = () ->\n lightboxKeyboardNavigationService.stop()\n lightboxService.close($el)\n\n $scope.$on \"watcher:add\", (ctx, item) ->\n selectedItem = item\n\n users = getFilteredUsers()\n render(users)\n\n lightboxService.open($el).then ->\n $el.find(\"input\").focus()\n lightboxKeyboardNavigationService.init($el)\n\n $scope.$watch \"usersSearch\", (searchingText) ->\n if not searchingText?\n return\n\n users = getFilteredUsers(searchingText)\n render(users)\n $el.find(\"input\").focus()\n\n $el.on \"click\", \".user-list-single\", debounce 2000, (event) ->\n closeLightbox()\n\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n $scope.$apply ->\n $scope.usersSearch = null\n $scope.$broadcast(\"watcher:added\", target.data(\"user-id\"))\n\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n\n closeLightbox()\n\n $scope.$apply ->\n $scope.usersSearch = null\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n templateUrl: \"common/lightbox/lightbox-users.html\"\n link:link\n }\n\nmodule.directive(\"tgLbWatchers\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", WatchersLightboxDirective])\n\n\n#############################################################################\n## Attachment Preview Lighbox\n#############################################################################\n\nAttachmentPreviewLightboxDirective = ($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile) ->\n link = ($scope, $el, attrs) ->\n template = $template.get(\"common/lightbox/lightbox-attachment-preview.html\", true)\n\n $scope.$on \"attachment:preview\", (event, attachment) ->\n lightboxService.open($el)\n render(attachment)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n render = (attachment) ->\n ctx = {\n url: attachment.url,\n title: attachment.description,\n name: attachment.name\n }\n\n html = template(ctx)\n html = $compile(html)($scope)\n $el.html(html)\n\n return {\n link: link\n }\n\nmodule.directive(\"tgLbAttachmentPreview\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", AttachmentPreviewLightboxDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n# Copyright (C) 2014-2015 Juan Francisco Alcántara \n# Copyright (C) 2014-2015 Alejandro Alonso \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/loader.coffee\n###\n\n# FIXME: this code not follows any style and any good practices on coffeescript\n# and it should be rewritten in coffeescript style classes.\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\ntimeout = @.taiga.timeout\n\nmodule = angular.module(\"taigaCommon\")\n\nLoaderDirective = (tgLoader, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n tgLoader.onStart () ->\n $(document.body).addClass(\"loader-active\")\n $el.addClass(\"active\")\n\n tgLoader.onEnd () ->\n $(document.body).removeClass(\"loader-active\")\n $el.removeClass(\"active\")\n\n return {\n link: link\n }\n\nmodule.directive(\"tgLoader\", [\"tgLoader\", \"$rootScope\", LoaderDirective])\n\nLoader = ($rootscope) ->\n config = {\n minTime: 300\n }\n\n open = false\n startLoadTime = 0\n requestCount = 0\n lastResponseDate = 0\n\n pageLoaded = (force = false) ->\n if startLoadTime\n timeoutValue = 0\n\n if !force\n endTime = new Date().getTime()\n diff = endTime - startLoadTime\n\n if diff < config.minTime\n timeoutValue = config.minTime - diff\n\n timeout timeoutValue, ->\n $rootscope.$broadcast(\"loader:end\")\n open = false\n window.prerenderReady = true # Needed by Prerender Server\n\n startLoadTime = 0\n requestCount = 0\n lastResponseDate = 0\n\n autoClose = () ->\n intervalAuto = setInterval (() ->\n if lastResponseDate && requestCount == 0\n pageLoaded()\n\n clearInterval(intervalAuto)\n ), 50\n\n start = () ->\n startLoadTime = new Date().getTime()\n $rootscope.$broadcast(\"loader:start\")\n open = true\n\n return {\n pageLoaded: pageLoaded\n start: (auto=false) ->\n if !open\n start()\n autoClose() if auto\n onStart: (fn) ->\n $rootscope.$on(\"loader:start\", fn)\n\n onEnd: (fn) ->\n $rootscope.$on(\"loader:end\", fn)\n\n logRequest: () ->\n requestCount++\n\n logResponse: () ->\n requestCount--\n lastResponseDate = new Date().getTime()\n }\n\n\nLoader.$inject = [\"$rootScope\"]\n\nmodule.factory(\"tgLoader\", Loader)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/lightboxes.coffee\n###\n\nmodule = angular.module(\"taigaCommon\")\n\nTgLoadingService = ($compile) ->\n spinner = \"loading...\"\n\n return () ->\n service = {\n settings: {\n target: null,\n scope: null,\n classes: []\n timeout: 0,\n template: null\n },\n target: (target) ->\n service.settings.target = target\n\n return service\n scope: (scope) ->\n service.settings.scope = scope\n\n return service\n template: (template) ->\n service.settings.template = template\n\n return service\n removeClasses: (classess...) ->\n service.settings.classes = classess\n\n return service\n timeout: (timeout) ->\n service.settings.timeout = timeout\n\n return service\n\n start: ->\n target = service.settings.target\n service.settings.classes.map (className) -> target.removeClass(className)\n\n # The loader is shown after that quantity of milliseconds\n timeoutId = setTimeout (->\n if not target.hasClass('loading')\n if !service.settings.template\n service.settings.template = target.html()\n\n target.addClass('loading')\n\n target.html(spinner)\n ), service.settings.timeout\n\n service.settings.timeoutId = timeoutId\n\n return service\n\n finish: ->\n target = service.settings.target\n timeoutId = service.settings.timeoutId\n\n if timeoutId\n clearTimeout(timeoutId)\n\n removeClasses = service.settings.classes\n removeClasses.map (className) -> service.settings.target.addClass(className)\n\n target.html(service.settings.template)\n target.removeClass('loading')\n\n if service.settings.scope\n $compile(target.contents())(service.settings.scope)\n\n return service\n }\n\n return service\n\nTgLoadingService.$inject = [\n \"$compile\"\n]\n\nmodule.factory(\"$tgLoading\", TgLoadingService)\n\nLoadingDirective = ($loading) ->\n link = ($scope, $el, attr) ->\n currentLoading = null\n template = $el.html()\n\n $scope.$watch attr.tgLoading, (showLoading) =>\n if showLoading\n currentLoading = $loading()\n .target($el)\n .timeout(50)\n .template(template)\n .scope($scope)\n .start()\n else if currentLoading\n currentLoading.finish()\n\n return {\n link:link\n }\n\nmodule.directive(\"tgLoading\", [\"$tgLoading\", LoadingDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/popovers.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaCommon\")\n\n#############################################################################\n## UserStory status Directive (popover for change status)\n#############################################################################\n\nUsStatusDirective = ($repo, $template) ->\n ###\n Print the status of a US and a popover to change it.\n - tg-us-status: The user story\n - on-update: Method call after US is updated\n\n Example:\n\n div.status(tg-us-status=\"us\" on-update=\"ctrl.loadSprintState()\")\n a.us-status(href=\"\", title=\"Status Name\")\n\n NOTE: This directive need 'usStatusById' and 'project'.\n ###\n template = $template.get(\"common/popover/popover-us-status.html\", true)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n render = (us) ->\n usStatusDomParent = $el.find(\".us-status\")\n usStatusDom = $el.find(\".us-status .us-status-bind\")\n usStatusById = $scope.usStatusById\n\n if usStatusById[us.status]\n usStatusDom.text(usStatusById[us.status].name)\n usStatusDomParent.css(\"color\", usStatusById[us.status].color)\n\n $el.on \"click\", \".us-status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", debounce 2000, (event) ->\n event.preventDefault()\n event.stopPropagation()\n\n target = angular.element(event.currentTarget)\n\n us = $scope.$eval($attrs.tgUsStatus)\n us.status = target.data(\"status-id\")\n render(us)\n\n $el.find(\".pop-status\").popover().close()\n\n $scope.$apply () ->\n $repo.save(us).then ->\n $scope.$eval($attrs.onUpdate)\n\n\n $scope.$on(\"userstories:loaded\", -> render($scope.$eval($attrs.tgUsStatus)))\n $scope.$on(\"$destroy\", -> $el.off())\n\n # Bootstrap\n us = $scope.$eval($attrs.tgUsStatus)\n render(us)\n\n bindOnce $scope, \"project\", (project) ->\n html = template({\"statuses\": project.us_statuses})\n $el.append(html)\n\n # If the user has not enough permissions the click events are unbinded\n if $scope.project.my_permissions.indexOf(\"modify_us\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n\n return {link: link}\n\nmodule.directive(\"tgUsStatus\", [\"$tgRepo\", \"$tgTemplate\", UsStatusDirective])\n\n#############################################################################\n## Related Task Status Directive\n#############################################################################\n\nRelatedTaskStatusDirective = ($repo, $template) ->\n ###\n Print the status of a related task and a popover to change it.\n - tg-related-task-status: The related task\n - on-update: Method call after US is updated\n\n Example:\n\n div.status(tg-related-task-status=\"task\" on-update=\"ctrl.loadSprintState()\")\n a.task-status(href=\"\", title=\"Status Name\")\n\n NOTE: This directive need 'taskStatusById' and 'project'.\n ###\n selectionTemplate = $template.get(\"common/popover/popover-related-task-status.html\", true)\n\n updateTaskStatus = ($el, task, taskStatusById) ->\n taskStatusDomParent = $el.find(\".us-status\")\n taskStatusDom = $el.find(\".task-status .task-status-bind\")\n\n if taskStatusById[task.status]\n taskStatusDom.text(taskStatusById[task.status].name)\n taskStatusDomParent.css('color', taskStatusById[task.status].color)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n task = $scope.$eval($attrs.tgRelatedTaskStatus)\n notAutoSave = $scope.$eval($attrs.notAutoSave)\n autoSave = !notAutoSave\n\n $el.on \"click\", \".task-status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n\n $el.find(\".pop-status\").popover().open()\n\n # pop = $el.find(\".pop-status\")\n # popoverService.open(pop)\n\n $el.on \"click\", \".status\", debounce 2000, (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n task.status = target.data(\"status-id\")\n $el.find(\".pop-status\").popover().close()\n updateTaskStatus($el, task, $scope.taskStatusById)\n\n if autoSave\n $scope.$apply () ->\n $repo.save(task).then ->\n $scope.$eval($attrs.onUpdate)\n $scope.$emit(\"related-tasks:status-changed\")\n\n taiga.bindOnce $scope, \"project\", (project) ->\n $el.append(selectionTemplate({ 'statuses': project.task_statuses }))\n updateTaskStatus($el, task, $scope.taskStatusById)\n\n # If the user has not enough permissions the click events are unbinded\n if project.my_permissions.indexOf(\"modify_task\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgRelatedTaskStatus\", [\"$tgRepo\", \"$tgTemplate\", RelatedTaskStatusDirective])\n\n#############################################################################\n## jQuery plugin for Popover\n#############################################################################\n\n$.fn.popover = () ->\n $el = @\n\n isVisible = () =>\n $el.css({\n \"display\": \"block\",\n \"visibility\": \"hidden\"\n })\n\n docViewTop = $(window).scrollTop()\n docViewBottom = docViewTop + $(window).height()\n\n docViewWidth = $(window).width()\n docViewRight = docViewWidth\n docViewLeft = 0\n\n elemTop = $el.offset().top\n elemBottom = elemTop + $el.height()\n\n elemWidth = $el.width()\n elemLeft = $el.offset().left\n elemRight = $el.offset().left + elemWidth\n\n $el.css({\n \"display\": \"none\",\n \"visibility\": \"visible\"\n })\n\n return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop) && (elemLeft >= docViewLeft) && (elemRight <= docViewRight))\n\n closePopover = (onClose) =>\n if onClose then onClose.call($el)\n\n $el.fadeOut () =>\n $el\n .removeClass(\"active\")\n .removeClass(\"fix\")\n\n $el.off(\"popup:close\")\n\n\n closeAll = () =>\n $(\".popover.active\").each () ->\n $(this).trigger(\"popup:close\")\n\n open = (onClose) =>\n if $el.hasClass(\"active\")\n close()\n else\n closeAll()\n\n if !isVisible()\n $el.addClass(\"fix\")\n\n $el.fadeIn () =>\n $el.addClass(\"active\")\n $(document.body).off(\"popover\")\n\n $(document.body).one \"click.popover\", () =>\n closeAll()\n\n $el.on \"popup:close\", (e) => closePopover(onClose)\n\n close = () =>\n $el.trigger(\"popup:close\")\n\n return {open: open, close: close, closeAll: closeAll}\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/raven-logger.coffee\n###\n\n\ntaiga = @.taiga\n\nmodule = angular.module(\"taigaCommon\")\n\nExceptionHandlerFactory = ($log, @config) ->\n ravenConfig = @config.get(\"ravenConfig\", null)\n if ravenConfig\n $log.debug \"Using the RavenJS exception handler.\"\n Raven.config(ravenConfig).install()\n return (exception, cause) ->\n $log.error.apply($log, arguments)\n Raven.captureException(exception)\n\n else\n $log.debug \"Using the default logging exception handler.\"\n return (exception, cause) ->\n $log.error.apply($log, arguments)\n\nmodule.factory(\"$exceptionHandler\", [\"$log\", \"$tgConfig\", ExceptionHandlerFactory])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/tags.coffee\n###\n\ntaiga = @.taiga\ntrim = @.taiga.trim\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaCommon\")\n\n# Directive that parses/format tags inputfield.\n\nTagsDirective = ->\n formatter = (v) ->\n if _.isArray(v)\n return v.join(\", \")\n return \"\"\n\n parser = (v) ->\n return [] if not v\n result = _(v.split(\",\")).map((x) -> _.str.trim(x))\n\n return result.value()\n\n link = ($scope, $el, $attrs, $ctrl) ->\n $ctrl.$formatters.push(formatter)\n $ctrl.$parsers.push(parser)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n require: \"ngModel\"\n link: link\n }\n\nmodule.directive(\"tgTags\", TagsDirective)\n\n\nColorizeTagsDirective = ->\n templates = {\n backlog: _.template(\"\"\"\n <% _.each(tags, function(tag) { %>\n \"><%- tag.name %>\n <% }) %>\n \"\"\")\n kanban: _.template(\"\"\"\n <% _.each(tags, function(tag) { %>\n \" title=\"<%- tag.name %>\" />\n <% }) %>\n \"\"\")\n taskboard: _.template(\"\"\"\n <% _.each(tags, function(tag) { %>\n \" title=\"<%- tag.name %>\" />\n <% }) %>\n \"\"\")\n }\n\n link = ($scope, $el, $attrs, $ctrl) ->\n render = (srcTags) ->\n template = templates[$attrs.tgColorizeTagsType]\n srcTags.sort()\n tags = _.map srcTags, (tag) ->\n color = $scope.project.tags_colors[tag]\n return {name: tag, color: color}\n\n html = template({tags: tags})\n $el.html(html)\n\n $scope.$watch $attrs.tgColorizeTags, (tags) ->\n render(tags) if tags?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgColorizeTags\", ColorizeTagsDirective)\n\n\n#############################################################################\n## TagLine Directive (for Lightboxes)\n#############################################################################\n\nLbTagLineDirective = ($rs, $template, $compile) ->\n ENTER_KEY = 13\n COMMA_KEY = 188\n\n templateTags = $template.get(\"common/tag/lb-tag-line-tags.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n ## Render\n renderTags = (tags, tagsColors) ->\n ctx = {\n tags: _.map(tags, (t) -> {name: t, color: tagsColors[t]})\n }\n\n _.map ctx.tags, (tag) =>\n if tag.color\n tag.style = \"border-left: 5px solid #{tag.color}\"\n\n html = $compile(templateTags(ctx))($scope)\n $el.find(\"div.tags-container\").html(html)\n\n showSaveButton = -> $el.find(\".save\").removeClass(\"hidden\")\n hideSaveButton = -> $el.find(\".save\").addClass(\"hidden\")\n\n resetInput = ->\n $el.find(\"input\").val(\"\")\n $el.find(\"input\").autocomplete(\"close\")\n\n ## Aux methods\n addValue = (value) ->\n value = trim(value.toLowerCase())\n return if value.length == 0\n\n tags = _.clone($model.$modelValue, false)\n tags = [] if not tags?\n tags.push(value) if value not in tags\n\n $scope.$apply ->\n $model.$setViewValue(tags)\n\n hideSaveButton()\n\n deleteValue = (value) ->\n value = trim(value.toLowerCase())\n return if value.length == 0\n\n tags = _.clone($model.$modelValue, false)\n tags = _.pull(tags, value)\n\n $scope.$apply ->\n $model.$setViewValue(tags)\n\n saveInputTag = () ->\n value = $el.find(\"input\").val()\n\n addValue(value)\n resetInput()\n\n removeInputLastCharacter = (input) =>\n inputValue = input.val()\n input.val inputValue.substring(0, inputValue.length - 1)\n\n ## Events\n $el.on \"keypress\", \"input\", (event) ->\n return if event.keyCode != ENTER_KEY\n event.preventDefault()\n\n $el.on \"keyup\", \"input\", (event) ->\n target = angular.element(event.currentTarget)\n\n if event.keyCode == ENTER_KEY\n saveInputTag()\n else if event.keyCode == COMMA_KEY\n removeInputLastCharacter(target)\n saveInputTag()\n else\n if target.val().length\n showSaveButton()\n else\n hideSaveButton()\n\n $el.on \"click\", \".save\", (event) ->\n event.preventDefault()\n saveInputTag()\n\n $el.on \"click\", \".icon-delete\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n value = target.siblings(\".tag-name\").text()\n deleteValue(value)\n\n bindOnce $scope, \"project\", (project) ->\n positioningFunction = (position, elements) ->\n menu = elements.element.element\n menu.css(\"width\", elements.target.width)\n menu.css(\"top\", position.top)\n menu.css(\"left\", position.left)\n\n $el.find(\"input\").autocomplete({\n source: _.keys(project.tags_colors)\n position: {\n my: \"left top\",\n using: positioningFunction\n }\n select: (event, ui) ->\n addValue(ui.item.value)\n ui.item.value = \"\"\n })\n\n $scope.$watch $attrs.ngModel, (tags) ->\n tagsColors = $scope.project?.tags_colors or []\n renderTags(tags, tagsColors)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link:link,\n require:\"ngModel\"\n templateUrl: \"common/tag/lb-tag-line.html\"\n }\n\nmodule.directive(\"tgLbTagLine\", [\"$tgResources\", \"$tgTemplate\", \"$compile\", LbTagLineDirective])\n\n\n#############################################################################\n## TagLine Directive (for detail pages)\n#############################################################################\n\nTagLineDirective = ($rootScope, $repo, $rs, $confirm, $qqueue, $template, $compile) ->\n ENTER_KEY = 13\n ESC_KEY = 27\n COMMA_KEY = 188\n\n templateTags = $template.get(\"common/tag/tags-line-tags.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n if $attrs.requiredPerm?\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) != -1\n\n return true\n\n ## Render\n renderTags = (tags, tagsColors) ->\n ctx = {\n tags: _.map(tags, (t) -> {name: t, color: tagsColors[t]})\n isEditable: isEditable()\n }\n html = $compile(templateTags(ctx))($scope)\n $el.find(\"div.tags-container\").html(html)\n\n renderInReadModeOnly = ->\n $el.find(\".add-tag\").remove()\n $el.find(\"input\").remove()\n $el.find(\".save\").remove()\n\n showAddTagButton = -> $el.find(\".add-tag\").removeClass(\"hidden\")\n hideAddTagButton = -> $el.find(\".add-tag\").addClass(\"hidden\")\n\n showAddTagButtonText = -> $el.find(\".add-tag-text\").removeClass(\"hidden\")\n hideAddTagButtonText = -> $el.find(\".add-tag-text\").addClass(\"hidden\")\n\n showSaveButton = -> $el.find(\".save\").removeClass(\"hidden\")\n hideSaveButton = -> $el.find(\".save\").addClass(\"hidden\")\n\n showInput = -> $el.find(\"input\").removeClass(\"hidden\").focus()\n hideInput = -> $el.find(\"input\").addClass(\"hidden\").blur()\n resetInput = ->\n $el.find(\"input\").val(\"\")\n $el.find(\"input\").autocomplete(\"close\")\n\n ## Aux methods\n addValue = $qqueue.bindAdd (value) ->\n value = trim(value.toLowerCase())\n return if value.length == 0\n\n tags = _.clone($model.$modelValue.tags, false)\n tags = [] if not tags?\n tags.push(value) if value not in tags\n\n model = $model.$modelValue.clone()\n model.tags = tags\n $model.$setViewValue(model)\n\n onSuccess = ->\n $rootScope.$broadcast(\"object:updated\")\n onError = ->\n $confirm.notify(\"error\")\n model.revert()\n $model.$setViewValue(model)\n $repo.save(model).then(onSuccess, onError)\n\n hideSaveButton()\n\n deleteValue = $qqueue.bindAdd (value) ->\n value = trim(value.toLowerCase())\n return if value.length == 0\n\n tags = _.clone($model.$modelValue.tags, false)\n tags = _.pull(tags, value)\n\n model = $model.$modelValue.clone()\n model.tags = tags\n $model.$setViewValue(model)\n\n onSuccess = ->\n $rootScope.$broadcast(\"object:updated\")\n onError = ->\n $confirm.notify(\"error\")\n model.revert()\n $model.$setViewValue(model)\n\n return $repo.save(model).then(onSuccess, onError)\n\n saveInputTag = () ->\n value = $el.find(\"input\").val()\n\n addValue(value)\n resetInput()\n\n removeInputLastCharacter = (input) =>\n inputValue = input.val()\n input.val inputValue.substring(0, inputValue.length - 1)\n\n ## Events\n $el.on \"keypress\", \"input\", (event) ->\n return if event.keyCode not in [ENTER_KEY, ESC_KEY]\n event.preventDefault()\n\n $el.on \"keyup\", \"input\", (event) ->\n target = angular.element(event.currentTarget)\n\n if event.keyCode == ENTER_KEY\n saveInputTag()\n else if event.keyCode == COMMA_KEY\n removeInputLastCharacter(target)\n saveInputTag()\n else if event.keyCode == ESC_KEY\n resetInput()\n hideInput()\n hideSaveButton()\n showAddTagButton()\n else\n if target.val().length\n showSaveButton()\n else\n hideSaveButton()\n\n $el.on \"click\", \".save\", (event) ->\n event.preventDefault()\n saveInputTag()\n\n $el.on \"click\", \".add-tag\", (event) ->\n event.preventDefault()\n hideAddTagButton()\n showInput()\n\n $el.on \"click\", \".icon-delete\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n value = target.siblings(\".tag-name\").text()\n\n deleteValue(value)\n\n bindOnce $scope, \"project.tags_colors\", (tags_colors) ->\n if not isEditable()\n renderInReadModeOnly()\n return\n\n showAddTagButton()\n\n positioningFunction = (position, elements) ->\n menu = elements.element.element\n menu.css(\"width\", elements.target.width)\n menu.css(\"top\", position.top)\n menu.css(\"left\", position.left)\n\n $el.find(\"input\").autocomplete({\n source: _.keys(tags_colors)\n position: {\n my: \"left top\",\n using: positioningFunction\n }\n select: (event, ui) ->\n addValue(ui.item.value)\n ui.item.value = \"\"\n })\n\n $scope.$watch $attrs.ngModel, (model) ->\n return if not model\n\n if model.tags?.length\n hideAddTagButtonText()\n else\n showAddTagButtonText()\n\n tagsColors = $scope.project?.tags_colors or []\n renderTags(model.tags, tagsColors)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link:link,\n require:\"ngModel\"\n templateUrl: \"common/tag/tag-line.html\"\n }\n\nmodule.directive(\"tgTagLine\", [\"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$tgQqueue\",\n \"$tgTemplate\", \"$compile\", TagLineDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/wisiwyg.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaCommon\")\n\n# How to test lists (-, *, 1.)\n# test it with text after & before the list\n# + is the cursor position\n\n# CASE 1\n# - aa+\n# --> enter\n# - aa\n# - +\n\n# CASE 1\n# - +\n# --> enter\n\n# +\n\n# CASE 3\n# - bb+cc\n# --> enter\n# - bb\n# - cc\n\n# CASE 3\n# +- aa\n# --> enter\n\n# - aa\n\n#############################################################################\n## WYSIWYG markitup editor directive\n#############################################################################\nMarkitupDirective = ($rootscope, $rs, $selectedText, $template, $compile, $translate) ->\n previewTemplate = $template.get(\"common/wysiwyg/wysiwyg-markitup-preview.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n element = angular.element($el)\n previewDomNode = $(\"
\", {class: \"preview\"})\n\n closePreviewMode = ->\n element.parents(\".markdown\").find(\".preview\").remove()\n element.parents(\".markItUp\").show()\n\n $scope.$on \"markdown-editor:submit\", ->\n closePreviewMode()\n\n preview = ->\n markdownDomNode = element.parents(\".markdown\")\n markItUpDomNode = element.parents(\".markItUp\")\n $rs.mdrender.render($scope.projectId, $model.$modelValue).then (data) ->\n html = previewTemplate({data: data.data})\n html = $compile(html)($scope)\n\n markdownDomNode.append(html)\n markItUpDomNode.hide()\n\n markdown = element.closest(\".markdown\")\n\n markdown.on \"mouseup.preview\", \".preview\", (event) ->\n event.preventDefault()\n target = angular.element(event.target)\n\n if !target.is('a') and $selectedText.get().length\n return\n\n markdown.off(\".preview\")\n closePreviewMode()\n\n setCaretPosition = (textarea, caretPosition) ->\n if textarea.createTextRange\n range = textarea.createTextRange()\n range.move(\"character\", caretPosition)\n range.select()\n\n else if textarea.selectionStart\n textarea.focus()\n textarea.setSelectionRange(caretPosition, caretPosition)\n\n # Calculate the scroll position\n totalLines = textarea.value.split(\"\\n\").length\n line = textarea.value[0..(caretPosition - 1)].split(\"\\n\").length\n scrollRelation = line / totalLines\n $el.scrollTop((scrollRelation * $el[0].scrollHeight) - ($el.height() / 2))\n\n addLine = (textarea, nline, replace) ->\n lines = textarea.value.split(\"\\n\")\n\n if replace\n lines[nline] = replace + lines[nline]\n else\n lines[nline] = \"\"\n\n cursorPosition = 0\n\n for line, key in lines\n cursorPosition += line.length + 1 || 1\n\n break if key == nline\n\n textarea.value = lines.join(\"\\n\")\n\n #return the new position\n if replace\n return cursorPosition - lines[nline].length + replace.length - 1\n else\n return cursorPosition\n\n prepareUrlFormatting = (markItUp) ->\n regex = /(<<<|>>>)/gi\n result = 0\n indices = []\n (indices.push(result.index)) while ( (result = regex.exec(markItUp.textarea.value)) )\n markItUp.donotparse = indices\n\n urlFormatting = (markItUp) ->\n regex = /<<>>/gi\n endIndex = 0\n loop\n result = regex.exec(markItUp.textarea.value)\n break if !result\n if result.index not in markItUp.donotparse\n endIndex = result.index\n break\n\n value = markItUp.textarea.value\n url = value.substring(startIndex, endIndex).replace('<<<', '').replace('>>>', '')\n url = url.replace('(', '%28').replace(')', '%29')\n url = url.replace('[', '%5B').replace(']', '%5D')\n value = value.substring(0, startIndex) + url + value.substring(endIndex+3, value.length)\n markItUp.textarea.value = value\n markItUp.donotparse = undefined\n\n markdownTitle = (markItUp, char) ->\n heading = \"\"\n n = $.trim(markItUp.selection or markItUp.placeHolder).length\n\n for i in [0..n-1]\n heading += char\n\n return \"\\n\"+heading+\"\\n\"\n\n renderMarkItUp = () ->\n markdownSettings =\n nameSpace: \"markdown\"\n onShiftEnter: {keepDefault:false, openWith:\"\\n\\n\"}\n onEnter:\n keepDefault: false,\n replaceWith: () ->\n # Allow textcomplete to intercept the enter key if the options list is displayed\n # @todo There doesn't seem to be a more graceful way to do this with the textcomplete API.\n if not $('.textcomplete-dropdown').is(':visible')\n \"\\n\"\n afterInsert: (data) ->\n lines = data.textarea.value.split(\"\\n\")\n # Detect if we are in this situation +- aa at the beginning if the textarea\n if data.caretPosition > 0\n cursorLine = data.textarea.value[0..(data.caretPosition - 1)].split(\"\\n\").length\n else\n cursorLine = 1\n\n newLineContent = data.textarea.value[data.caretPosition..].split(\"\\n\")[0]\n lastLine = lines[cursorLine - 1]\n\n # unordered list -\n match = lastLine.match /^(\\s*- ).*/\n\n if match\n emptyListItem = lastLine.match /^(\\s*)\\-\\s$/\n\n if emptyListItem\n nline = cursorLine - 1\n replace = null\n else\n nline = cursorLine\n replace = \"#{match[1]}\"\n\n markdownCaretPositon = addLine(data.textarea, nline, replace)\n\n # unordered list *\n match = lastLine.match /^(\\s*\\* ).*/\n\n if match\n emptyListItem = lastLine.match /^(\\s*\\* )$/\n\n if emptyListItem\n nline = cursorLine - 1\n replace = null\n else\n nline = cursorLine\n replace = \"#{match[1]}\"\n\n markdownCaretPositon = addLine(data.textarea, nline, replace)\n\n # ordered list\n match = lastLine.match /^(\\s*)(\\d+)\\.\\s/\n\n if match\n emptyListItem = lastLine.match /^(\\s*)(\\d+)\\.\\s$/\n\n if emptyListItem\n nline = cursorLine - 1\n replace = null\n else\n nline = cursorLine\n replace = \"#{match[1] + (parseInt(match[2], 10) + 1)}. \"\n\n markdownCaretPositon = addLine(data.textarea, nline, replace)\n\n setCaretPosition(data.textarea, markdownCaretPositon) if markdownCaretPositon\n\n markupSet: [\n {\n name: $translate.instant(\"COMMON.WYSIWYG.H1_BUTTON\")\n key: \"1\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H1_SAMPLE_TEXT\")\n closeWith: (markItUp) -> markdownTitle(markItUp, \"=\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.H2_BUTTON\")\n key: \"2\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H2_SAMPLE_TEXT\")\n closeWith: (markItUp) -> markdownTitle(markItUp, \"-\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.H3_BUTTON\")\n key: \"3\"\n openWith: \"### \"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H3_SAMPLE_TEXT\")\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.BOLD_BUTTON\")\n key: \"B\"\n openWith: \"**\"\n closeWith: \"**\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.BOLD_BUTTON_SAMPLE_TEXT\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT\")\n key: \"I\"\n openWith: \"_\"\n closeWith: \"_\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.STRIKE_BUTTON\")\n key: \"S\"\n openWith: \"~~\"\n closeWith: \"~~\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.STRIKE_SAMPLE_TEXT\")\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.BULLETED_LIST_BUTTON\")\n openWith: \"- \"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.BULLETED_LIST_SAMPLE_TEXT\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.NUMERIC_LIST_BUTTON\")\n openWith: (markItUp) -> markItUp.line+\". \"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.NUMERIC_LIST_SAMPLE_TEXT\")\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.PICTURE_BUTTON\")\n key: \"P\"\n openWith: \"![\"\n closeWith: '](<<<[![Url:!:http://]!]>>> \"[![Title]!]\")'\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.PICTURE_SAMPLE_TEXT\")\n beforeInsert:(markItUp) -> prepareUrlFormatting(markItUp)\n afterInsert:(markItUp) -> urlFormatting(markItUp)\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.LINK_BUTTON\")\n key: \"L\"\n openWith: \"[\"\n closeWith: '](<<<[![Url:!:http://]!]>>> \"[![Title]!]\")'\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.LINK_SAMPLE_TEXT\")\n beforeInsert:(markItUp) -> prepareUrlFormatting(markItUp)\n afterInsert:(markItUp) -> urlFormatting(markItUp)\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.QUOTE_BLOCK_BUTTON\")\n openWith: \"> \"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.QUOTE_BLOCK_SAMPLE_TEXT\")\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.CODE_BLOCK_BUTTON\")\n openWith: \"```\\n\"\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.CODE_BLOCK_SAMPLE_TEXT\")\n closeWith: \"\\n```\"\n },\n {\n separator: \"---------------\"\n },\n {\n name: $translate.instant(\"COMMON.WYSIWYG.PREVIEW_BUTTON\")\n call: preview\n className: \"preview-icon\"\n },\n ]\n afterInsert: (event) ->\n target = angular.element(event.textarea)\n $model.$setViewValue(target.val())\n\n element\n .markItUpRemove()\n .markItUp(markdownSettings)\n .textcomplete([\n # us, task, and issue autocomplete: #id or #\n {\n cache: true\n match: /(^|\\s)#([a-z0-9]+)$/i,\n search: (term, callback) ->\n term = taiga.slugify(term)\n\n searchTypes = ['issues', 'tasks', 'userstories']\n searchProps = ['ref', 'subject']\n\n filter = (item) =>\n for prop in searchProps\n if taiga.slugify(item[prop]).indexOf(term) >= 0\n return true\n return false\n\n $rs.search.do($scope.projectId, term).then (res) =>\n # ignore wikipages if they're the only results. can't exclude them in search\n if res.count < 1 or res.count == res.wikipages.length\n callback([])\n\n else\n for type in searchTypes\n if res[type] and res[type].length > 0\n callback(res[type].filter(filter), true)\n\n # must signal end of lists\n callback([])\n\n replace: (res) ->\n return \"$1\\##{res.ref} \"\n\n template: (res, term) ->\n return \"\\##{res.ref} - #{res.subject}\"\n }\n\n # username autocomplete: @username or @\n {\n cache: true\n match: /(^|\\s)@([a-z0-9\\-\\._]{2,})$/i\n search: (term, callback) ->\n username = taiga.slugify(term)\n searchProps = ['username', 'full_name', 'full_name_display']\n\n if $scope.project.members.length < 1\n callback([])\n\n else\n callback $scope.project.members.filter (user) =>\n for prop in searchProps\n if taiga.slugify(user[prop]).indexOf(username) >= 0\n return true\n return false\n\n replace: (user) ->\n return \"$1@#{user.username} \"\n\n template: (user) ->\n return \"#{user.username} - #{user.full_name_display}\"\n }\n\n # wiki pages autocomplete: [[slug or [[\n # if the search function was called with the 3rd param the regex\n # like the docs claim, we could combine this with the #123 search\n {\n cache: true\n match: /(^|\\s)\\[\\[([a-z0-9\\-]+)$/i\n search: (term, callback) ->\n term = taiga.slugify(term)\n\n $rs.search.do($scope.projectId, term).then (res) =>\n if res.count < 1\n callback([])\n\n if res.count < 1 or not res.wikipages or res.wikipages.length <= 0\n callback([])\n\n else\n callback res.wikipages.filter((page) =>\n return taiga.slugify(page['slug']).indexOf(term) >= 0\n ), true\n\n # must signal end of lists\n callback([])\n\n\n replace: (res) ->\n return \"$1[[#{res.slug}]]\"\n\n template: (res, term) ->\n return res.slug\n }\n ],\n {\n debounce: 200\n }\n )\n\n renderMarkItUp()\n\n unbind = $rootscope.$on \"$translateChangeEnd\", renderMarkItUp\n\n element.on \"keypress\", (event) ->\n $scope.$apply()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n unbind()\n\n return {link:link, require:\"ngModel\"}\n\nmodule.directive(\"tgMarkitup\", [\"$rootScope\", \"$tgResources\", \"$selectedText\", \"$tgTemplate\", \"$compile\",\n \"$translate\", MarkitupDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ndebounceLeading = @.taiga.debounceLeading\n\n\nmodule = angular.module(\"taigaBacklog\")\n\n#############################################################################\n## Issues Filters Directive\n#############################################################################\n\nBacklogFiltersDirective = ($q, $log, $location, $templates) ->\n template = $templates.get(\"backlog/filters.html\", true)\n templateSelected = $templates.get(\"backlog/filter-selected.html\", true)\n\n link = ($scope, $el, $attrs) ->\n currentFiltersType = ''\n\n $ctrl = $el.closest(\".wrapper\").controller()\n selectedFilters = []\n\n showFilters = (title, type) ->\n $el.find(\".filters-cats\").hide()\n $el.find(\".filter-list\").removeClass(\"hidden\")\n $el.find(\"h2.breadcrumb\").removeClass(\"hidden\")\n $el.find(\"h2 a.subfilter span.title\").html(title)\n $el.find(\"h2 a.subfilter span.title\").prop(\"data-type\", type)\n\n currentFiltersType = getFiltersType()\n\n showCategories = ->\n $el.find(\".filters-cats\").show()\n $el.find(\".filter-list\").addClass(\"hidden\")\n $el.find(\"h2.breadcrumb\").addClass(\"hidden\")\n\n initializeSelectedFilters = () ->\n showCategories()\n selectedFilters = []\n\n for name, values of $scope.filters\n for val in values\n selectedFilters.push(val) if val.selected\n\n renderSelectedFilters()\n\n renderSelectedFilters = ->\n _.map selectedFilters, (f) =>\n if f.color\n f.style = \"border-left: 3px solid #{f.color}\"\n\n html = templateSelected({filters: selectedFilters})\n $el.find(\".filters-applied\").html(html)\n\n renderFilters = (filters) ->\n _.map filters, (f) =>\n if f.color\n f.style = \"border-left: 3px solid #{f.color}\"\n\n html = template({filters:filters})\n $el.find(\".filter-list\").html(html)\n\n getFiltersType = () ->\n return $el.find(\"h2 a.subfilter span.title\").prop('data-type')\n\n reloadUserstories = () ->\n currentFiltersType = getFiltersType()\n\n $q.all([$ctrl.loadUserstories(), $ctrl.generateFilters()]).then () ->\n currentFilters = $scope.filters[currentFiltersType]\n renderFilters(_.reject(currentFilters, \"selected\"))\n\n toggleFilterSelection = (type, id) ->\n currentFiltersType = getFiltersType()\n\n filters = $scope.filters[type]\n filter = _.find(filters, {id: id})\n filter.selected = (not filter.selected)\n\n if filter.selected\n selectedFilters.push(filter)\n $scope.$apply ->\n $ctrl.selectFilter(type, id)\n else\n selectedFilters = _.reject selectedFilters, (selected) ->\n return filter.type == selected.type && filter.id == selected.id\n\n $ctrl.unselectFilter(type, id)\n\n renderSelectedFilters(selectedFilters)\n\n if type == currentFiltersType\n renderFilters(_.reject(filters, \"selected\"))\n\n reloadUserstories()\n\n selectQFilter = debounceLeading 100, (value) ->\n return if value is undefined\n\n if value.length == 0\n $ctrl.replaceFilter(\"q\", null)\n else\n $ctrl.replaceFilter(\"q\", value)\n\n reloadUserstories()\n\n $scope.$watch(\"filtersQ\", selectQFilter)\n\n ## Angular Watchers\n $scope.$on \"backlog:loaded\", (ctx) ->\n initializeSelectedFilters()\n\n $scope.$on \"filters:update\", (ctx) ->\n $ctrl.generateFilters().then () ->\n filters = $scope.filters[currentFiltersType]\n\n if currentFiltersType\n renderFilters(_.reject(filters, \"selected\"))\n\n ## Dom Event Handlers\n $el.on \"click\", \".filters-cats > ul > li > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n tags = $scope.filters[target.data(\"type\")]\n\n renderFilters(_.reject(tags, \"selected\"))\n showFilters(target.attr(\"title\"), target.data('type'))\n\n $el.on \"click\", \".filters-inner > .filters-step-cat > .breadcrumb > .back\", (event) ->\n event.preventDefault()\n showCategories()\n\n $el.on \"click\", \".filters-applied a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n id = target.data(\"id\")\n type = target.data(\"type\")\n toggleFilterSelection(type, id)\n\n $el.on \"click\", \".filter-list .single-filter\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n if target.hasClass(\"active\")\n target.removeClass(\"active\")\n else\n target.addClass(\"active\")\n\n id = target.data(\"id\")\n type = target.data(\"type\")\n toggleFilterSelection(type, id)\n\n return {link:link}\n\nmodule.directive(\"tgBacklogFilters\", [\"$q\", \"$log\", \"$tgLocation\", \"$tgTemplate\", BacklogFiltersDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/lightboxes.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaBacklog\")\n\n#############################################################################\n## Creare/Edit Sprint Lightbox Directive\n#############################################################################\n\nCreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, $translate) ->\n link = ($scope, $el, attrs) ->\n hasErrors = false\n createSprint = true\n\n resetSprint = () ->\n $scope.sprint = {\n project: null\n name: null\n estimated_start: null\n estimated_finish: null\n }\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n target = angular.element(event.currentTarget)\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n\n submitButton = $el.find(\".submit-button\")\n form = $el.find(\"form\").checksley()\n\n if not form.validate()\n hasErrors = true\n $el.find(\".last-sprint-name\").addClass(\"disappear\")\n return\n\n hasErrors = false\n newSprint = angular.copy($scope.sprint)\n broadcastEvent = null\n\n if createSprint\n newSprint.estimated_start = moment(newSprint.estimated_start, prettyDate).format(\"YYYY-MM-DD\")\n newSprint.estimated_finish = moment(newSprint.estimated_finish,prettyDate).format(\"YYYY-MM-DD\")\n promise = $repo.create(\"milestones\", newSprint)\n broadcastEvent = \"sprintform:create:success\"\n else\n newSprint.setAttr(\"estimated_start\",\n moment(newSprint.estimated_start, prettyDate).format(\"YYYY-MM-DD\"))\n newSprint.setAttr(\"estimated_finish\",\n moment(newSprint.estimated_finish, prettyDate).format(\"YYYY-MM-DD\"))\n promise = $repo.save(newSprint)\n broadcastEvent = \"sprintform:edit:success\"\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise.then (data) ->\n currentLoading.finish()\n $scope.sprintsCounter += 1 if createSprint\n $rootscope.$broadcast(broadcastEvent, data)\n\n lightboxService.close($el)\n\n promise.then null, (data) ->\n currentLoading.finish()\n\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"light-error\", data._error_message)\n else if data.__all__\n $confirm.notify(\"light-error\", data.__all__[0])\n\n remove = ->\n title = $translate.instant(\"LIGHTBOX.DELETE_SPRINT.TITLE\")\n message = $scope.sprint.name\n\n $confirm.askOnDelete(title, message).then (askResponse) =>\n onSuccess = ->\n askResponse.finish()\n $scope.milestonesCounter -= 1\n lightboxService.close($el)\n $rootscope.$broadcast(\"sprintform:remove:success\", $scope.sprint)\n\n onError = ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n $repo.remove($scope.sprint).then(onSuccess, onError)\n\n getLastSprint = ->\n openSprints = _.filter $scope.sprints, (sprint) ->\n return !sprint.closed\n\n sortedSprints = _.sortBy openSprints, (sprint) ->\n return moment(sprint.estimated_finish, 'YYYY-MM-DD').format('X')\n\n return sortedSprints[sortedSprints.length - 1]\n\n $scope.$on \"sprintform:create\", (event, projectId) ->\n resetSprint()\n\n form = $el.find(\"form\").checksley()\n form.reset()\n\n createSprint = true\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n $scope.sprint.project = projectId\n $scope.sprint.name = null\n $scope.sprint.slug = null\n\n lastSprint = getLastSprint()\n\n estimatedStart = moment()\n\n if lastSprint\n estimatedStart = moment(lastSprint.estimated_finish)\n else if $scope.sprint.estimated_start\n estimatedStart = moment($scope.sprint.estimated_start)\n\n $scope.sprint.estimated_start = estimatedStart.format(prettyDate)\n\n estimatedFinish = moment().add(2, \"weeks\")\n\n if lastSprint\n estimatedFinish = moment(lastSprint.estimated_finish).add(2, \"weeks\")\n else if $scope.sprint.estimated_finish\n estimatedFinish = moment($scope.sprint.estimated_finish)\n\n $scope.sprint.estimated_finish = estimatedFinish.format(prettyDate)\n\n lastSprintNameDom = $el.find(\".last-sprint-name\")\n if lastSprint?.name?\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME\", {\n lastSprint: lastSprint.name})\n lastSprintNameDom.html(text)\n\n $el.find(\".delete-sprint\").addClass(\"hidden\")\n\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.TITLE\")\n $el.find(\".title\").text(text)\n\n text = $translate.instant(\"COMMON.CREATE\")\n $el.find(\".button-green\").text(text)\n\n lightboxService.open($el)\n $el.find(\".sprint-name\").focus()\n $el.find(\".last-sprint-name\").removeClass(\"disappear\")\n\n $scope.$on \"sprintform:edit\", (ctx, sprint) ->\n resetSprint()\n\n createSprint = false\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n\n $scope.$apply ->\n $scope.sprint = sprint\n $scope.sprint.estimated_start = moment($scope.sprint.estimated_start).format(prettyDate)\n $scope.sprint.estimated_finish = moment($scope.sprint.estimated_finish).format(prettyDate)\n\n $el.find(\".delete-sprint\").removeClass(\"hidden\")\n\n editSprint = $translate.instant(\"BACKLOG.EDIT_SPRINT\")\n $el.find(\".title\").text(editSprint)\n\n save = $translate.instant(\"COMMON.SAVE\")\n $el.find(\".button-green\").text(save)\n\n lightboxService.open($el)\n $el.find(\".sprint-name\").focus().select()\n $el.find(\".last-sprint-name\").addClass(\"disappear\")\n\n $el.on \"keyup\", \".sprint-name\", (event) ->\n if $el.find(\".sprint-name\").val().length > 0 or hasErrors\n $el.find(\".last-sprint-name\").addClass(\"disappear\")\n else\n $el.find(\".last-sprint-name\").removeClass(\"disappear\")\n\n $el.on \"submit\", \"form\", submit\n\n $el.on \"click\", \".delete-sprint .icon-delete\", (event) ->\n event.preventDefault()\n remove()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n resetSprint()\n\n return {link: link}\n\n\nmodule.directive(\"tgLbCreateEditSprint\", [\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$rootScope\",\n \"lightboxService\"\n \"$tgLoading\",\n \"$translate\",\n CreateEditSprint\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ntimeout = @.taiga.timeout\nbindMethods = @.taiga.bindMethods\ngenerateHash = @.taiga.generateHash\n\nmodule = angular.module(\"taigaBacklog\")\n\n#############################################################################\n## Backlog Controller\n#############################################################################\n\nclass BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgEvents\",\n \"$tgAnalytics\",\n \"$translate\",\n \"$tgLoading\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q,\n @location, @appMetaService, @navUrls, @events, @analytics, @translate, @loading) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"BACKLOG.SECTION_NAME\")\n @showTags = false\n @activeFilters = false\n @scope.showGraphPlaceholder = null\n\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n title = @translate.instant(\"BACKLOG.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"BACKLOG.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n if @rs.userstories.getShowTags(@scope.projectId)\n @showTags = true\n\n @scope.$broadcast(\"showTags\", @showTags)\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n initializeEventHandlers: ->\n @scope.$on \"usform:bulk:success\", =>\n @.loadUserstories()\n @.loadProjectStats()\n @analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on backlog\", 1)\n\n @scope.$on \"sprintform:create:success\", =>\n @.loadSprints()\n @.loadProjectStats()\n @analytics.trackEvent(\"sprint\", \"create\", \"create sprint on backlog\", 1)\n\n @scope.$on \"usform:new:success\", =>\n @.loadUserstories()\n @.loadProjectStats()\n\n @rootscope.$broadcast(\"filters:update\")\n @analytics.trackEvent(\"userstory\", \"create\", \"create userstory on backlog\", 1)\n\n @scope.$on \"sprintform:edit:success\", =>\n @.loadProjectStats()\n\n @scope.$on \"sprintform:remove:success\", (event, sprint) =>\n @.loadSprints()\n @.loadProjectStats()\n @.loadUserstories()\n\n if sprint.closed\n @.loadClosedSprints()\n\n @rootscope.$broadcast(\"filters:update\")\n\n @scope.$on \"usform:edit:success\", =>\n @.loadUserstories()\n @rootscope.$broadcast(\"filters:update\")\n\n @scope.$on(\"sprint:us:move\", @.moveUs)\n @scope.$on(\"sprint:us:moved\", @.loadSprints)\n @scope.$on(\"sprint:us:moved\", @.loadProjectStats)\n\n @scope.$on(\"backlog:load-closed-sprints\", @.loadClosedSprints)\n @scope.$on(\"backlog:unload-closed-sprints\", @.unloadClosedSprints)\n\n initializeSubscription: ->\n routingKey1 = \"changes.project.#{@scope.projectId}.userstories\"\n @events.subscribe @scope, routingKey1, (message) =>\n @.loadUserstories()\n @.loadSprints()\n\n routingKey2 = \"changes.project.#{@scope.projectId}.milestones\"\n @events.subscribe @scope, routingKey2, (message) =>\n @.loadSprints()\n\n toggleShowTags: ->\n @scope.$apply =>\n @showTags = !@showTags\n @rs.userstories.storeShowTags(@scope.projectId, @showTags)\n\n toggleActiveFilters: ->\n @activeFilters = !@activeFilters\n\n loadProjectStats: ->\n return @rs.projects.stats(@scope.projectId).then (stats) =>\n @scope.stats = stats\n totalPoints = if stats.total_points then stats.total_points else stats.defined_points\n\n if totalPoints\n @scope.stats.completedPercentage = Math.round(100 * stats.closed_points / totalPoints)\n else\n @scope.stats.completedPercentage = 0\n\n @scope.showGraphPlaceholder = !(stats.total_points? && stats.total_milestones?)\n return stats\n\n unloadClosedSprints: ->\n @scope.$apply =>\n @scope.closedSprints = []\n @rootscope.$broadcast(\"closed-sprints:reloaded\", [])\n\n loadClosedSprints: ->\n params = {closed: true}\n return @rs.sprints.list(@scope.projectId, params).then (result) =>\n sprints = result.milestones\n\n @scope.totalClosedMilestones = result.closed\n\n # NOTE: Fix order of USs because the filter orderBy does not work propertly in partials files\n for sprint in sprints\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\")\n @scope.closedSprints = sprints\n @scope.closedSprintsById = groupBy(sprints, (x) -> x.id)\n @rootscope.$broadcast(\"closed-sprints:reloaded\", sprints)\n return sprints\n\n loadSprints: ->\n params = {closed: false}\n return @rs.sprints.list(@scope.projectId, params).then (result) =>\n sprints = result.milestones\n\n @scope.totalMilestones = sprints\n @scope.totalClosedMilestones = result.closed\n @scope.totalOpenMilestones = result.open\n @scope.totalMilestones = @scope.totalOpenMilestones + @scope.totalClosedMilestones\n\n # NOTE: Fix order of USs because the filter orderBy does not work propertly in partials files\n for sprint in sprints\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\")\n\n @scope.sprints = sprints\n @scope.openSprints = _.filter(sprints, (sprint) => not sprint.closed).reverse()\n @scope.closedSprints = [] if !@scope.closedSprints\n\n @scope.sprintsCounter = sprints.length\n @scope.sprintsById = groupBy(sprints, (x) -> x.id)\n @rootscope.$broadcast(\"sprints:loaded\", sprints)\n return sprints\n\n resetFilters: ->\n selectedTags = _.filter(@scope.filters.tags, \"selected\")\n selectedStatuses = _.filter(@scope.filters.status, \"selected\")\n\n @scope.filtersQ = \"\"\n\n _.each [selectedTags, selectedStatuses], (filterGrp) =>\n _.each filterGrp, (item) =>\n filters = @scope.filters[item.type]\n filter = _.find(filters, {id: taiga.toString(item.id)})\n filter.selected = false\n\n @.unselectFilter(item.type, item.id)\n\n @.loadUserstories()\n @rootscope.$broadcast(\"filters:update\")\n\n loadUserstories: ->\n @scope.httpParams = @.getUrlFilters()\n @rs.userstories.storeQueryParams(@scope.projectId, @scope.httpParams)\n\n promise = @rs.userstories.listUnassigned(@scope.projectId, @scope.httpParams)\n\n return promise.then (userstories) =>\n # NOTE: Fix order of USs because the filter orderBy does not work propertly in the partials files\n @scope.userstories = _.sortBy(userstories, \"backlog_order\")\n\n @.setSearchDataFilters()\n\n # The broadcast must be executed when the DOM has been fully reloaded.\n # We can't assure when this exactly happens so we need a defer\n scopeDefer @scope, =>\n @scope.$broadcast(\"userstories:loaded\")\n\n return userstories\n\n loadBacklog: ->\n return @q.all([\n @.loadProjectStats(),\n @.loadSprints(),\n @.loadUserstories()\n ])\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.is_backlog_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.closedMilestones = !!project.total_closed_milestones\n @scope.$emit('project:loaded', project)\n @scope.points = _.sortBy(project.points, \"order\")\n @scope.pointsById = groupBy(project.points, (x) -> x.id)\n @scope.usStatusById = groupBy(project.us_statuses, (x) -> x.id)\n @scope.usStatusList = _.sortBy(project.us_statuses, \"id\")\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.initializeSubscription()\n\n return promise\n .then(=> @.loadBacklog())\n .then(=> @.generateFilters())\n .then(=> @scope.$emit(\"backlog:loaded\"))\n\n prepareBulkUpdateData: (uses, field=\"backlog_order\") ->\n return _.map(uses, (x) -> {\"us_id\": x.id, \"order\": x[field]})\n\n resortUserStories: (uses, field=\"backlog_order\") ->\n items = []\n\n for item, index in uses\n item[field] = index\n if item.isModified()\n items.push(item)\n\n return items\n\n moveUs: (ctx, usList, newUsIndex, newSprintId) ->\n oldSprintId = usList[0].milestone\n project = usList[0].project\n\n movedFromClosedSprint = false\n movedToClosedSprint = false\n\n sprint = @scope.sprintsById[oldSprintId]\n\n # Move from closed sprint\n if !sprint && @scope.closedSprintsById\n sprint = @scope.closedSprintsById[oldSprintId]\n movedFromClosedSprint = true if sprint\n\n newSprint = @scope.sprintsById[newSprintId]\n\n # Move to closed sprint\n if !newSprint && newSprintId\n newSprint = @scope.closedSprintsById[newSprintId]\n movedToClosedSprint = true if newSprint\n\n # In the same sprint or in the backlog\n if newSprintId == oldSprintId\n items = null\n userstories = null\n\n if newSprintId == null\n userstories = @scope.userstories\n else\n userstories = newSprint.user_stories\n\n @scope.$apply ->\n for us, key in usList\n r = userstories.indexOf(us)\n userstories.splice(r, 1)\n\n args = [newUsIndex, 0].concat(usList)\n Array.prototype.splice.apply(userstories, args)\n\n # If in backlog\n if newSprintId == null\n # Rehash userstories order field\n\n items = @.resortUserStories(userstories, \"backlog_order\")\n data = @.prepareBulkUpdateData(items, \"backlog_order\")\n\n # Persist in bulk all affected\n # userstories with order change\n @rs.userstories.bulkUpdateBacklogOrder(project, data).then =>\n for us in usList\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n # For sprint\n else\n # Rehash userstories order field\n items = @.resortUserStories(userstories, \"sprint_order\")\n data = @.prepareBulkUpdateData(items, \"sprint_order\")\n\n # Persist in bulk all affected\n # userstories with order change\n @rs.userstories.bulkUpdateSprintOrder(project, data).then =>\n for us in usList\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n return promise\n\n # From sprint to backlog\n if newSprintId == null\n us.milestone = null for us in usList\n\n @scope.$apply =>\n # Add new us to backlog userstories list\n # @scope.userstories.splice(newUsIndex, 0, us)\n args = [newUsIndex, 0].concat(usList)\n Array.prototype.splice.apply(@scope.userstories, args)\n\n for us, key in usList\n r = sprint.user_stories.indexOf(us)\n sprint.user_stories.splice(r, 1)\n\n # Persist the milestone change of userstory\n promise = @repo.save(us)\n\n # Rehash userstories order field\n # and persist in bulk all changes.\n promise = promise.then =>\n items = @.resortUserStories(@scope.userstories, \"backlog_order\")\n data = @.prepareBulkUpdateData(items, \"backlog_order\")\n return @rs.userstories.bulkUpdateBacklogOrder(us.project, data).then =>\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n if movedFromClosedSprint\n @rootscope.$broadcast(\"backlog:load-closed-sprints\")\n\n promise.then null, ->\n console.log \"FAIL\" # TODO\n\n return promise\n\n # From backlog to sprint\n if oldSprintId == null\n us.milestone = newSprintId for us in usList\n\n @scope.$apply =>\n args = [newUsIndex, 0].concat(usList)\n\n # Add moving us to sprint user stories list\n Array.prototype.splice.apply(newSprint.user_stories, args)\n\n # Remove moving us from backlog userstories lists.\n for us, key in usList\n r = @scope.userstories.indexOf(us)\n @scope.userstories.splice(r, 1)\n\n # From sprint to sprint\n else\n us.milestone = newSprintId for us in usList\n\n @scope.$apply =>\n args = [newUsIndex, 0].concat(usList)\n\n # Add new us to backlog userstories list\n Array.prototype.splice.apply(newSprint.user_stories, args)\n\n # Remove the us from the sprint list.\n for us in usList\n r = sprint.user_stories.indexOf(us)\n sprint.user_stories.splice(r, 1)\n\n # Persist the milestone change of userstory\n promises = _.map usList, (us) => @repo.save(us)\n\n # Rehash userstories order field\n # and persist in bulk all changes.\n promise = @q.all(promises).then =>\n items = @.resortUserStories(newSprint.user_stories, \"sprint_order\")\n data = @.prepareBulkUpdateData(items, \"sprint_order\")\n\n @rs.userstories.bulkUpdateSprintOrder(project, data).then (result) =>\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n @rs.userstories.bulkUpdateBacklogOrder(project, data).then =>\n for us in usList\n @rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId)\n\n if movedToClosedSprint || movedFromClosedSprint\n @scope.$broadcast(\"backlog:load-closed-sprints\")\n\n promise.then null, ->\n console.log \"FAIL\" # TODO\n\n return promise\n\n isFilterSelected: (type, id) ->\n if @searchdata[type]? and @searchdata[type][id]\n return true\n return false\n\n setSearchDataFilters: () ->\n urlfilters = @.getUrlFilters()\n\n if urlfilters.q\n @scope.filtersQ = @scope.filtersQ or urlfilters.q\n\n @searchdata = {}\n for name, value of urlfilters\n if not @searchdata[name]?\n @searchdata[name] = {}\n\n for val in taiga.toString(value).split(\",\")\n @searchdata[name][val] = true\n\n getUrlFilters: ->\n return _.pick(@location.search(), \"status\", \"tags\", \"q\")\n\n generateFilters: ->\n urlfilters = @.getUrlFilters()\n @scope.filters = {}\n\n loadFilters = {}\n loadFilters.project = @scope.projectId\n loadFilters.tags = urlfilters.tags\n loadFilters.status = urlfilters.status\n loadFilters.q = urlfilters.q\n loadFilters.milestone = 'null'\n\n return @rs.userstories.filtersData(loadFilters).then (data) =>\n choicesFiltersFormat = (choices, type, byIdObject) =>\n _.map choices, (t) ->\n t.type = type\n return t\n\n tagsFilterFormat = (tags) =>\n return _.map tags, (t) ->\n t.id = t.name\n t.type = 'tags'\n return t\n\n # Build filters data structure\n @scope.filters.status = choicesFiltersFormat(data.statuses, \"status\", @scope.usStatusById)\n @scope.filters.tags = tagsFilterFormat(data.tags)\n\n selectedTags = _.filter(@scope.filters.tags, \"selected\")\n selectedTags = _.map(selectedTags, \"id\")\n\n selectedStatuses = _.filter(@scope.filters.status, \"selected\")\n selectedStatuses = _.map(selectedStatuses, \"id\")\n\n @.markSelectedFilters(@scope.filters, urlfilters)\n\n #store query params\n @rs.userstories.storeQueryParams(@scope.projectId, {\n \"status\": selectedStatuses,\n \"tags\": selectedTags,\n \"project\": @scope.projectId\n \"milestone\": null\n })\n\n markSelectedFilters: (filters, urlfilters) ->\n # Build selected filters (from url) fast lookup data structure\n searchdata = {}\n for name, value of _.omit(urlfilters, \"page\", \"orderBy\")\n if not searchdata[name]?\n searchdata[name] = {}\n\n for val in \"#{value}\".split(\",\")\n searchdata[name][val] = true\n\n isSelected = (type, id) ->\n if searchdata[type]? and searchdata[type][id]\n return true\n return false\n\n for key, value of filters\n for obj in value\n obj.selected = if isSelected(obj.type, obj.id) then true else undefined\n\n ## Template actions\n\n updateUserStoryStatus: () ->\n @.setSearchDataFilters()\n @.generateFilters().then () =>\n @rootscope.$broadcast(\"filters:update\")\n @.loadProjectStats()\n\n editUserStory: (projectId, ref, $event) ->\n target = $($event.target)\n\n currentLoading = @loading()\n .target(target)\n .removeClasses(\"icon-edit\")\n .timeout(200)\n .start()\n\n @rs.userstories.getByRef(projectId, ref).then (us) =>\n @rootscope.$broadcast(\"usform:edit\", us)\n\n currentLoading.finish()\n\n deleteUserStory: (us) ->\n title = @translate.instant(\"US.TITLE_DELETE_ACTION\")\n\n message = us.subject\n\n @confirm.askOnDelete(title, message).then (askResponse) =>\n # We modify the userstories in scope so the user doesn't see the removed US for a while\n @scope.userstories = _.without(@scope.userstories, us)\n promise = @.repo.remove(us)\n promise.then =>\n askResponse.finish()\n @.loadBacklog()\n promise.then null, =>\n askResponse.finish(false)\n @confirm.notify(\"error\")\n\n addNewUs: (type) ->\n switch type\n when \"standard\" then @rootscope.$broadcast(\"usform:new\", @scope.projectId,\n @scope.project.default_us_status, @scope.usStatusList)\n when \"bulk\" then @rootscope.$broadcast(\"usform:bulk\", @scope.projectId,\n @scope.project.default_us_status)\n\n addNewSprint: () ->\n @rootscope.$broadcast(\"sprintform:create\", @scope.projectId)\n\nmodule.controller(\"BacklogController\", BacklogController)\n\n#############################################################################\n## Backlog Directive\n#############################################################################\n\nBacklogDirective = ($repo, $rootscope, $translate) ->\n ## Doom line Link\n doomLineTemplate = _.template(\"\"\"\n
<%- text %>
\n \"\"\")\n\n linkDoomLine = ($scope, $el, $attrs, $ctrl) ->\n reloadDoomLine = ->\n if $scope.stats? and $scope.stats.total_points? and $scope.stats.total_points != 0\n removeDoomlineDom()\n\n stats = $scope.stats\n\n total_points = stats.total_points\n current_sum = stats.assigned_points\n\n return if not $scope.userstories\n\n for us, i in $scope.userstories\n current_sum += us.total_points\n\n if current_sum > total_points\n domElement = $el.find('.backlog-table-body .us-item-row')[i]\n addDoomLineDom(domElement)\n\n break\n\n removeDoomlineDom = ->\n $el.find(\".doom-line\").remove()\n\n addDoomLineDom = (element) ->\n text = $translate.instant(\"BACKLOG.DOOMLINE\")\n $(element).before(doomLineTemplate({\"text\": text}))\n\n getUsItems = ->\n rowElements = $el.find('.backlog-table-body .us-item-row')\n return _.map(rowElements, (x) -> angular.element(x))\n\n $scope.$on(\"userstories:loaded\", reloadDoomLine)\n $scope.$watch \"stats\", reloadDoomLine\n\n ## Move to current sprint link\n\n linkToolbar = ($scope, $el, $attrs, $ctrl) ->\n moveToCurrentSprint = (selectedUss) ->\n ussCurrent = _($scope.userstories)\n\n # Remove them from backlog\n $scope.userstories = ussCurrent.without.apply(ussCurrent, selectedUss).value()\n\n extraPoints = _.map(selectedUss, (v, k) -> v.total_points)\n totalExtraPoints = _.reduce(extraPoints, (acc, num) -> acc + num)\n\n # Add them to current sprint\n $scope.sprints[0].user_stories = _.union($scope.sprints[0].user_stories, selectedUss)\n\n # Update the total of points\n $scope.sprints[0].total_points += totalExtraPoints\n\n $repo.saveAll(selectedUss).then ->\n $ctrl.loadSprints()\n $ctrl.loadProjectStats()\n\n\n shiftPressed = false\n lastChecked = null\n\n checkSelected = (target) ->\n lastChecked = target.closest(\".us-item-row\")\n moveToCurrentSprintDom = $el.find(\"#move-to-current-sprint\")\n selectedUsDom = $el.find(\".backlog-table-body input:checkbox:checked\")\n\n if selectedUsDom.length > 0 and $scope.sprints.length > 0\n moveToCurrentSprintDom.show()\n else\n moveToCurrentSprintDom.hide()\n\n target.closest('.us-item-row').toggleClass('ui-multisortable-multiple')\n\n $(window).on \"keydown.shift-pressed keyup.shift-pressed\", (event) ->\n shiftPressed = !!event.shiftKey\n\n return true\n\n # Enable move to current sprint only when there are selected us's\n $el.on \"change\", \".backlog-table-body input:checkbox\", (event) ->\n # check elements between the last two if shift is pressed\n if lastChecked && shiftPressed\n elements = []\n current = $(event.currentTarget).closest(\".us-item-row\")\n nextAll = lastChecked.nextAll()\n prevAll = lastChecked.prevAll()\n\n if _.some(nextAll, (next) -> next == current[0])\n elements = lastChecked.nextUntil(current)\n else if _.some(prevAll, (prev) -> prev == current[0])\n elements = lastChecked.prevUntil(current)\n\n _.map elements, (elm) ->\n input = $(elm).find(\"input:checkbox\")\n input.prop('checked', true)\n checkSelected(input)\n\n target = angular.element(event.currentTarget)\n target.closest(\".us-item-row\").toggleClass('is-checked')\n checkSelected(target)\n\n $el.on \"click\", \"#move-to-current-sprint\", (event) =>\n # Calculating the us's to be modified\n ussDom = $el.find(\".backlog-table-body input:checkbox:checked\")\n\n ussToMove = _.map ussDom, (item) ->\n item = $(item).closest('.tg-scope')\n itemScope = item.scope()\n itemScope.us.milestone = $scope.sprints[0].id\n return itemScope.us\n\n $scope.$apply(_.partial(moveToCurrentSprint, ussToMove))\n\n $el.on \"click\", \"#show-tags\", (event) ->\n event.preventDefault()\n\n $ctrl.toggleShowTags()\n\n showHideTags($ctrl)\n\n showHideTags = ($ctrl) ->\n elm = angular.element(\"#show-tags\")\n\n if $ctrl.showTags\n elm.addClass(\"active\")\n\n text = $translate.instant(\"BACKLOG.TAGS.HIDE\")\n elm.text(text)\n else\n elm.removeClass(\"active\")\n\n text = $translate.instant(\"BACKLOG.TAGS.SHOW\")\n elm.text(text)\n\n showHideFilter = ($scope, $el, $ctrl) ->\n sidebar = $el.find(\"sidebar.filters-bar\")\n sidebar.one \"transitionend\", () ->\n timeout 150, ->\n $rootscope.$broadcast(\"resize\")\n $('.burndown').css(\"visibility\", \"visible\")\n\n target = angular.element(\"#show-filters-button\")\n $('.burndown').css(\"visibility\", \"hidden\")\n sidebar.toggleClass(\"active\")\n target.toggleClass(\"active\")\n\n hideText = $translate.instant(\"BACKLOG.FILTERS.HIDE\")\n showText = $translate.instant(\"BACKLOG.FILTERS.SHOW\")\n\n toggleText(target.find(\".text\"), [hideText, showText])\n\n if !sidebar.hasClass(\"active\")\n $ctrl.resetFilters()\n\n $ctrl.toggleActiveFilters()\n\n ## Filters Link\n\n linkFilters = ($scope, $el, $attrs, $ctrl) ->\n $scope.filtersSearch = {}\n $el.on \"click\", \"#show-filters-button\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n showHideFilter($scope, $el, $ctrl)\n\n link = ($scope, $el, $attrs, $rootscope) ->\n $ctrl = $el.controller()\n\n linkToolbar($scope, $el, $attrs, $ctrl)\n linkFilters($scope, $el, $attrs, $ctrl)\n linkDoomLine($scope, $el, $attrs, $ctrl)\n\n $el.find(\".backlog-table-body\").disableSelection()\n\n filters = $ctrl.getUrlFilters()\n if filters.status ||\n filters.tags ||\n filters.q\n showHideFilter($scope, $el, $ctrl)\n\n $scope.$on \"showTags\", () ->\n showHideTags($ctrl)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n $(window).off(\".shift-pressed\")\n\n return {link: link}\n\n\nmodule.directive(\"tgBacklog\", [\"$tgRepo\", \"$rootScope\", \"$translate\", BacklogDirective])\n\n#############################################################################\n## User story points directive\n#############################################################################\n\nUsRolePointsSelectorDirective = ($rootscope, $template, $compile, $translate) ->\n selectionTemplate = $template.get(\"backlog/us-role-points-popover.html\", true)\n\n link = ($scope, $el, $attrs) ->\n # Watchers\n bindOnce $scope, \"project\", (project) ->\n roles = _.filter(project.roles, \"computable\")\n numberOfRoles = _.size(roles)\n\n if numberOfRoles > 1\n $el.append($compile(selectionTemplate({\"roles\": roles}))($scope))\n else\n $el.find(\".icon-arrow-bottom\").remove()\n $el.find(\".header-points\").addClass(\"not-clickable\")\n\n $scope.$on \"uspoints:select\", (ctx, roleId, roleName) ->\n $el.find(\".popover\").popover().close()\n $el.find(\".header-points\").html(\"#{roleName}/Total\")\n\n $scope.$on \"uspoints:clear-selection\", (ctx, roleId) ->\n $el.find(\".popover\").popover().close()\n\n text = $translate.instant(\"COMMON.FIELDS.POINTS\")\n $el.find(\".header-points\").text(text)\n\n # Dom Event Handlers\n $el.on \"click\", (event) ->\n target = angular.element(event.target)\n\n if target.is(\"span\") or target.is(\"div\")\n event.stopPropagation()\n\n $el.find(\".popover\").popover().open()\n\n $el.on \"click\", \".clear-selection\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n $rootscope.$broadcast(\"uspoints:clear-selection\")\n\n $el.on \"click\", \".role\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n rolScope = target.scope()\n $rootscope.$broadcast(\"uspoints:select\", target.data(\"role-id\"), target.text())\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgUsRolePointsSelector\", [\"$rootScope\", \"$tgTemplate\", \"$compile\", UsRolePointsSelectorDirective])\n\n\nUsPointsDirective = ($tgEstimationsService, $repo, $tgTemplate) ->\n rolesTemplate = $tgTemplate.get(\"common/estimation/us-points-roles-popover.html\", true)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n updatingSelectedRoleId = null\n selectedRoleId = null\n filteringRoleId = null\n estimationProcess = null\n\n $scope.$on \"uspoints:select\", (ctx, roleId, roleName) ->\n us = $scope.$eval($attrs.tgBacklogUsPoints)\n selectedRoleId = roleId\n estimationProcess.render()\n\n $scope.$on \"uspoints:clear-selection\", (ctx) ->\n us = $scope.$eval($attrs.tgBacklogUsPoints)\n selectedRoleId = null\n estimationProcess.render()\n\n $scope.$watch $attrs.tgBacklogUsPoints, (us) ->\n if us\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project)\n\n # Update roles\n roles = estimationProcess.calculateRoles()\n if roles.length == 0\n $el.find(\".icon-arrow-bottom\").remove()\n $el.find(\"a.us-points\").addClass(\"not-clickable\")\n\n else if roles.length == 1\n # Preselect the role if we have only one\n selectedRoleId = _.keys(us.points)[0]\n\n if estimationProcess.isEditable\n bindClickElements()\n\n estimationProcess.onSelectedPointForRole = (roleId, pointId) ->\n @save(roleId, pointId).then ->\n $ctrl.loadProjectStats()\n\n estimationProcess.render = () ->\n totalPoints = @calculateTotalPoints()\n if not selectedRoleId? or roles.length == 1\n text = totalPoints\n title = totalPoints\n else\n pointId = @us.points[selectedRoleId]\n pointObj = @pointsById[pointId]\n text = \"#{pointObj.name} / #{totalPoints}\"\n title = \"#{pointObj.name} / #{totalPoints}\"\n\n ctx = {\n totalPoints: totalPoints\n roles: @calculateRoles()\n editable: @isEditable\n text: text\n title: title\n }\n mainTemplate = \"common/estimation/us-estimation-total.html\"\n template = $tgTemplate.get(mainTemplate, true)\n html = template(ctx)\n @$el.html(html)\n\n estimationProcess.render()\n\n renderRolesSelector = () ->\n roles = estimationProcess.calculateRoles()\n html = rolesTemplate({\"roles\": roles})\n # Render into DOM and show the new created element\n $el.append(html)\n $el.find(\".pop-role\").popover().open(() -> $(this).remove())\n\n bindClickElements = () ->\n $el.on \"click\", \"a.us-points span\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n us = $scope.$eval($attrs.tgBacklogUsPoints)\n updatingSelectedRoleId = selectedRoleId\n if selectedRoleId?\n estimationProcess.renderPointsSelector(selectedRoleId)\n else\n renderRolesSelector()\n\n $el.on \"click\", \".role\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n us = $scope.$eval($attrs.tgBacklogUsPoints)\n updatingSelectedRoleId = target.data(\"role-id\")\n popRolesDom = $el.find(\".pop-role\")\n popRolesDom.find(\"a\").removeClass(\"active\")\n popRolesDom.find(\"a[data-role-id='#{updatingSelectedRoleId}']\").addClass(\"active\")\n estimationProcess.renderPointsSelector(updatingSelectedRoleId)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgBacklogUsPoints\", [\"$tgEstimationsService\", \"$tgRepo\", \"$tgTemplate\", UsPointsDirective])\n\n\n#############################################################################\n## Burndown graph directive\n#############################################################################\nToggleBurndownVisibility = ($storage) ->\n hide = () ->\n $(\".js-burndown-graph\").removeClass(\"shown\")\n $(\".js-toggle-burndown-visibility-button\").removeClass(\"active\")\n $(\".js-burndown-graph\").removeClass(\"open\")\n\n show = (firstLoad) ->\n $(\".js-toggle-burndown-visibility-button\").addClass(\"active\")\n\n if firstLoad\n $(\".js-burndown-graph\").addClass(\"shown\")\n else\n $(\".js-burndown-graph\").addClass(\"open\")\n\n link = ($scope, $el, $attrs) ->\n firstLoad = true\n hash = generateHash([\"is-burndown-grpahs-collapsed\"])\n $scope.isBurndownGraphCollapsed = $storage.get(hash) or false\n\n toggleGraph = ->\n if $scope.isBurndownGraphCollapsed\n hide(firstLoad)\n else\n show(firstLoad)\n\n firstLoad = false\n\n $scope.$watch \"showGraphPlaceholder\", () ->\n if $scope.showGraphPlaceholder?\n $scope.isBurndownGraphCollapsed = $scope.isBurndownGraphCollapsed || $scope.showGraphPlaceholder\n toggleGraph()\n\n $el.on \"click\", \".js-toggle-burndown-visibility-button\", ->\n $scope.isBurndownGraphCollapsed = !$scope.isBurndownGraphCollapsed\n $storage.set(hash, $scope.isBurndownGraphCollapsed)\n toggleGraph()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n }\n\nmodule.directive(\"tgToggleBurndownVisibility\", [\"$tgStorage\", ToggleBurndownVisibility])\n\n\n#############################################################################\n## Burndown graph directive\n#############################################################################\n\nBurndownBacklogGraphDirective = ($translate) ->\n redrawChart = (element, dataToDraw) ->\n width = element.width()\n element.height(width/6)\n milestonesRange = [0..(dataToDraw.milestones.length - 1)]\n data = []\n zero_line = _.map(dataToDraw.milestones, (ml) -> 0)\n data.push({\n data: _.zip(milestonesRange, zero_line)\n lines:\n fillColor : \"rgba(0,0,0,0)\"\n points:\n show: false\n })\n optimal_line = _.map(dataToDraw.milestones, (ml) -> ml.optimal)\n data.push({\n data: _.zip(milestonesRange, optimal_line)\n lines:\n fillColor : \"rgba(120,120,120,0.2)\"\n })\n evolution_line = _.filter(_.map(dataToDraw.milestones, (ml) -> ml.evolution), (evolution) -> evolution?)\n data.push({\n data: _.zip(milestonesRange, evolution_line)\n lines:\n fillColor : \"rgba(102,153,51,0.3)\"\n })\n team_increment_line = _.map(dataToDraw.milestones, (ml) -> -ml[\"team-increment\"])\n data.push({\n data: _.zip(milestonesRange, team_increment_line)\n lines:\n fillColor : \"rgba(153,51,51,0.3)\"\n })\n client_increment_line = _.map dataToDraw.milestones, (ml) ->\n -ml[\"team-increment\"] - ml[\"client-increment\"]\n data.push({\n data: _.zip(milestonesRange, client_increment_line)\n lines:\n fillColor : \"rgba(255,51,51,0.3)\"\n })\n\n colors = [\n \"rgba(0,0,0,1)\"\n \"rgba(120,120,120,0.2)\"\n \"rgba(102,153,51,1)\"\n \"rgba(153,51,51,1)\"\n \"rgba(255,51,51,1)\"\n ]\n\n options = {\n grid: {\n borderWidth: { top: 0, right: 1, left:0, bottom: 0 }\n borderColor: \"#ccc\"\n hoverable: true\n }\n xaxis: {\n ticks: dataToDraw.milestones.length\n axisLabel: $translate.instant(\"BACKLOG.CHART.XAXIS_LABEL\"),\n axisLabelUseCanvas: true\n axisLabelFontSizePixels: 12\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\"\n axisLabelPadding: 5\n tickFormatter: (val, axis) -> \"\"\n }\n yaxis: {\n axisLabel: $translate.instant(\"BACKLOG.CHART.YAXIS_LABEL\"),\n axisLabelUseCanvas: true\n axisLabelFontSizePixels: 12\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\"\n axisLabelPadding: 5\n }\n series: {\n shadowSize: 0\n lines: {\n show: true\n fill: true\n }\n points: {\n show: true\n fill: true\n radius: 4\n lineWidth: 2\n }\n }\n colors: colors\n tooltip: true\n tooltipOpts: {\n content: (label, xval, yval, flotItem) ->\n if flotItem.seriesIndex == 1\n ctx = {sprintName: dataToDraw.milestones[xval].name, value: Math.abs(yval)}\n return $translate.instant(\"BACKLOG.CHART.OPTIMAL\", ctx)\n else if flotItem.seriesIndex == 2\n ctx = {sprintName: dataToDraw.milestones[xval].name, value: Math.abs(yval)}\n return $translate.instant(\"BACKLOG.CHART.REAL\", ctx)\n else if flotItem.seriesIndex == 3\n ctx = {sprintName: dataToDraw.milestones[xval].name, value: Math.abs(yval)}\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_TEAM\", ctx)\n else\n ctx = {sprintName: dataToDraw.milestones[xval].name, value: Math.abs(yval)}\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_CLIENT\", ctx)\n }\n }\n\n element.empty()\n element.plot(data, options).data(\"plot\")\n\n link = ($scope, $el, $attrs) ->\n element = angular.element($el)\n\n $scope.$watch \"stats\", (value) ->\n if $scope.stats?\n redrawChart(element, $scope.stats)\n\n $scope.$on \"resize\", ->\n redrawChart(element, $scope.stats)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgBurndownBacklogGraph\", [\"$translate\", BurndownBacklogGraphDirective])\n\n\n#############################################################################\n## Backlog progress bar directive\n#############################################################################\n\nTgBacklogProgressBarDirective = ($template, $compile) ->\n template = $template.get(\"backlog/progress-bar.html\", true)\n\n render = (scope, el, projectPointsPercentaje, closedPointsPercentaje) ->\n html = template({\n projectPointsPercentaje: projectPointsPercentaje,\n closedPointsPercentaje:closedPointsPercentaje\n })\n html = $compile(html)(scope)\n el.html(html)\n\n adjustPercentaje = (percentage) ->\n adjusted = _.max([0 , percentage])\n adjusted = _.min([100, adjusted])\n return Math.round(adjusted)\n\n link = ($scope, $el, $attrs) ->\n element = angular.element($el)\n\n $scope.$watch $attrs.tgBacklogProgressBar, (stats) ->\n if stats?\n totalPoints = if stats.total_points then stats.total_points else stats.defined_points\n definedPoints = stats.defined_points\n closedPoints = stats.closed_points\n if definedPoints > totalPoints\n projectPointsPercentaje = totalPoints * 100 / definedPoints\n closedPointsPercentaje = closedPoints * 100 / definedPoints\n else\n projectPointsPercentaje = 100\n closedPointsPercentaje = closedPoints * 100 / totalPoints\n\n projectPointsPercentaje = adjustPercentaje(projectPointsPercentaje - 3)\n closedPointsPercentaje = adjustPercentaje(closedPointsPercentaje - 3)\n render($scope, $el, projectPointsPercentaje, closedPointsPercentaje)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgBacklogProgressBar\", [\"$tgTemplate\", \"$compile\", TgBacklogProgressBarDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/sortable.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\n\nmodule = angular.module(\"taigaBacklog\")\n\n\n#############################################################################\n## Sortable Directive\n#############################################################################\n\ndeleteElement = (el) ->\n el.scope().$destroy()\n el.off()\n el.remove()\n\nBacklogSortableDirective = ($repo, $rs, $rootscope, $tgConfirm, $translate) ->\n # Notes about jquery bug:\n # http://stackoverflow.com/questions/5791886/jquery-draggable-shows-\n # helper-in-wrong-place-when-scrolled-down-page\n\n link = ($scope, $el, $attrs) ->\n getUsIndex = (us) =>\n return $(us).index(\".backlog-table-body .row\")\n\n bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions we don't enable the sortable\n if not (project.my_permissions.indexOf(\"modify_us\") > -1)\n return\n\n filterError = ->\n text = $translate.instant(\"BACKLOG.SORTABLE_FILTER_ERROR\")\n $tgConfirm.notify(\"error\", text)\n\n $el.sortable({\n items: \".us-item-row\",\n cancel: \".popover\"\n connectWith: \".sprint\"\n dropOnEmpty: true\n placeholder: \"row us-item-row us-item-drag sortable-placeholder\"\n scroll: true\n disableHorizontalScroll: true\n # A consequence of length of backlog user story item\n # the default tolerance (\"intersection\") not works properly.\n tolerance: \"pointer\"\n # Revert on backlog is disabled bacause it works bad. Something\n # on the current taiga backlog structure or style makes jquery ui\n # works unexpectly (in some circumstances calculates wrong\n # position for revert).\n revert: false\n start: () ->\n $(document.body).addClass(\"drag-active\")\n stop: () ->\n $(document.body).removeClass(\"drag-active\")\n\n if $el.hasClass(\"active-filters\")\n $el.sortable(\"cancel\")\n filterError()\n })\n\n $el.on \"multiplesortreceive\", (event, ui) ->\n if $el.hasClass(\"active-filters\")\n ui.source.sortable(\"cancel\")\n filterError()\n\n return\n\n itemUs = ui.item.scope().us\n itemIndex = getUsIndex(ui.item)\n\n deleteElement(ui.item)\n\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, null)\n ui.item.find('a').removeClass('noclick')\n\n $el.on \"multiplesortstop\", (event, ui) ->\n # When parent not exists, do nothing\n if $(ui.items[0]).parent().length == 0\n return\n\n if $el.hasClass(\"active-filters\")\n return\n\n items = _.sortBy ui.items, (item) ->\n return $(item).index()\n\n index = _.min _.map items, (item) ->\n return getUsIndex(item)\n\n us = _.map items, (item) ->\n item = $(item)\n itemUs = item.scope().us\n\n # HACK: setTimeout prevents that firefox click\n # event fires just after drag ends\n setTimeout ( =>\n item.find('a').removeClass('noclick')\n ), 300\n\n return itemUs\n\n $scope.$emit(\"sprint:us:move\", us, index, null)\n\n $el.on \"sortstart\", (event, ui) ->\n ui.item.find('a').addClass('noclick')\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nBacklogEmptySortableDirective = ($repo, $rs, $rootscope) ->\n # Notes about jquery bug:\n # http://stackoverflow.com/questions/5791886/jquery-draggable-shows-\n # helper-in-wrong-place-when-scrolled-down-page\n\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions we don't enable the sortable\n if project.my_permissions.indexOf(\"modify_us\") > -1\n $el.sortable({\n items: \".us-item-row\",\n dropOnEmpty: true\n })\n\n $el.on \"sortreceive\", (event, ui) ->\n itemUs = ui.item.scope().us\n itemIndex = ui.item.index()\n\n deleteElement(ui.item)\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, null)\n\n ui.item.find('a').removeClass('noclick')\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nSprintSortableDirective = ($repo, $rs, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions we don't enable the sortable\n if project.my_permissions.indexOf(\"modify_us\") > -1\n $el.sortable({\n scroll: true\n dropOnEmpty: true\n items: \".sprint-table .milestone-us-item-row\"\n disableHorizontalScroll: true\n connectWith: \".sprint,.backlog-table-body,.empty-backlog\"\n placeholder: \"row us-item-row sortable-placeholder\"\n forcePlaceholderSize:true\n })\n\n $el.on \"multiplesortreceive\", (event, ui) ->\n items = _.sortBy ui.items, (item) ->\n return $(item).index()\n\n index = _.min _.map items, (item) ->\n return $(item).index()\n\n us = _.map items, (item) ->\n item = $(item)\n itemUs = item.scope().us\n\n deleteElement(item)\n\n return itemUs\n\n $scope.$emit(\"sprint:us:move\", us, index, $scope.sprint.id)\n\n $el.on \"multiplesortstop\", (event, ui) ->\n # When parent not exists, do nothing\n if ui.item.parent().length == 0\n return\n\n itemUs = ui.item.scope().us\n itemIndex = ui.item.index()\n\n # HACK: setTimeout prevents that firefox click\n # event fires just after drag ends\n setTimeout ( =>\n ui.item.find('a').removeClass('noclick')\n ), 300\n\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, $scope.sprint.id)\n\n $el.on \"sortstart\", (event, ui) ->\n ui.item.find('a').addClass('noclick')\n\n return {link:link}\n\n\nmodule.directive(\"tgBacklogSortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n \"$tgConfirm\",\n \"$translate\",\n BacklogSortableDirective\n])\n\nmodule.directive(\"tgBacklogEmptySortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n BacklogEmptySortableDirective\n])\n\nmodule.directive(\"tgSprintSortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n SprintSortableDirective\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog/sprints.coffee\n###\n\ntaiga = @.taiga\n\nmodule = angular.module(\"taigaBacklog\")\n\n\n#############################################################################\n## Sprint Actions Directive\n#############################################################################\n\nBacklogSprintDirective = ($repo, $rootscope) ->\n sprintTableMinHeight = 50\n slideOptions = {\n duration: 500,\n easing: 'linear'\n }\n\n toggleSprint = ($el) =>\n sprintTable = $el.find(\".sprint-table\")\n sprintArrow = $el.find(\".icon-arrow-up\")\n\n sprintArrow.toggleClass('active')\n sprintTable.toggleClass('open')\n\n link = ($scope, $el, $attrs) ->\n $scope.$watch $attrs.tgBacklogSprint, (sprint) ->\n sprint = $scope.$eval($attrs.tgBacklogSprint)\n\n if sprint.closed\n $el.addClass(\"sprint-closed\")\n else\n toggleSprint($el)\n\n # Event Handlers\n $el.on \"click\", \".sprint-name > .icon-arrow-up\", (event) ->\n event.preventDefault()\n\n toggleSprint($el)\n\n $el.find(\".sprint-table\").slideToggle(slideOptions)\n\n $el.on \"click\", \".sprint-name > .icon-edit\", (event) ->\n event.preventDefault()\n\n sprint = $scope.$eval($attrs.tgBacklogSprint)\n $rootscope.$broadcast(\"sprintform:edit\", sprint)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgBacklogSprint\", [\"$tgRepo\", \"$rootScope\", BacklogSprintDirective])\n\n\n#############################################################################\n## Sprint Header Directive\n#############################################################################\n\nBacklogSprintHeaderDirective = ($navUrls, $template, $compile, $translate) ->\n template = $template.get(\"backlog/sprint-header.html\")\n\n link = ($scope, $el, $attrs, $model) ->\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\")\n\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_milestone\") != -1\n\n isVisible = ->\n return $scope.project.my_permissions.indexOf(\"view_milestones\") != -1\n\n render = (sprint) ->\n taskboardUrl = $navUrls.resolve(\"project-taskboard\",\n {project: $scope.project.slug, sprint: sprint.slug})\n\n start = moment(sprint.estimated_start).format(prettyDate)\n finish = moment(sprint.estimated_finish).format(prettyDate)\n estimatedDateRange = \"#{start}-#{finish}\"\n\n ctx = {\n name: sprint.name\n taskboardUrl: taskboardUrl\n estimatedDateRange: estimatedDateRange\n closedPoints: sprint.closed_points or 0\n totalPoints: sprint.total_points or 0\n isVisible: isVisible()\n isEditable: isEditable()\n }\n\n templateScope = $scope.$new()\n\n _.assign(templateScope, ctx)\n\n compiledTemplate = $compile(template)(templateScope)\n $el.html(compiledTemplate)\n\n $scope.$watch $attrs.ngModel, (sprint) ->\n render(sprint)\n\n $scope.$on \"sprintform:edit:success\", ->\n render($model.$modelValue)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgBacklogSprintHeader\", [\"$tgNavUrls\", \"$tgTemplate\", \"$compile\", \"$translate\"\n BacklogSprintHeaderDirective])\n\n\n#############################################################################\n## Toggle Closed Sprints Directive\n#############################################################################\n\nToggleExcludeClosedSprintsVisualization = ($rootscope, $loading, $translate) ->\n excludeClosedSprints = true\n\n link = ($scope, $el, $attrs) ->\n # insert loading wrapper\n loadingElm = $(\"
\")\n $el.after(loadingElm)\n\n currentLoading = null\n\n # Event Handlers\n $el.on \"click\", (event) ->\n event.preventDefault()\n excludeClosedSprints = not excludeClosedSprints\n\n currentLoading = $loading()\n .target(loadingElm)\n .start()\n\n if excludeClosedSprints\n $rootscope.$broadcast(\"backlog:unload-closed-sprints\")\n else\n $rootscope.$broadcast(\"backlog:load-closed-sprints\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $scope.$on \"closed-sprints:reloaded\", (ctx, sprints) =>\n currentLoading.finish()\n\n if sprints.length > 0\n key = \"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS\"\n else\n key = \"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS\"\n\n text = $translate.instant(key)\n\n $el.find(\".text\").text(text)\n\n return {link: link}\n\nmodule.directive(\"tgBacklogToggleClosedSprintsVisualization\", [\"$rootScope\", \"$tgLoading\", \"$translate\",\n ToggleExcludeClosedSprintsVisualization])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard/charts.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ntimeout = @.taiga.timeout\n\nmodule = angular.module(\"taigaTaskboard\")\n\n#############################################################################\n## Sprint burndown graph directive\n#############################################################################\n\nSprintGraphDirective = ($translate)->\n redrawChart = (element, dataToDraw) ->\n width = element.width()\n element.height(240)\n\n days = _.map(dataToDraw, (x) -> moment(x.day))\n\n data = []\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, (d) -> d.optimal_points))\n lines:\n fillColor : \"rgba(120,120,120,0.2)\"\n })\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, (d) -> d.open_points))\n lines:\n fillColor : \"rgba(102,153,51,0.3)\"\n })\n\n options =\n grid:\n borderWidth: { top: 0, right: 1, left:0, bottom: 0 }\n borderColor: '#ccc'\n hoverable: true\n xaxis:\n tickSize: [1, \"day\"]\n min: days[0]\n max: _.last(days)\n mode: \"time\"\n daysNames: days\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.XAXIS_LABEL\")\n axisLabelUseCanvas: true\n axisLabelFontSizePixels: 12\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif'\n axisLabelPadding: 5\n yaxis:\n min: 0\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.YAXIS_LABEL\")\n axisLabelUseCanvas: true\n axisLabelFontSizePixels: 12\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif'\n axisLabelPadding: 5\n series:\n shadowSize: 0\n lines:\n show: true\n fill: true\n points:\n show: true\n fill: true\n radius: 4\n lineWidth: 2\n colors: [\"rgba(102,153,51,1)\", \"rgba(120,120,120,0.2)\"]\n tooltip: true\n tooltipOpts:\n content: (label, xval, yval, flotItem) ->\n formattedDate = moment(xval).format($translate.instant(\"TASKBOARD.CHARTS.DATE\"))\n roundedValue = Math.round(yval)\n\n if flotItem.seriesIndex == 1\n return $translate.instant(\"TASKBOARD.CHARTS.OPTIMAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n })\n\n else\n return $translate.instant(\"TASKBOARD.CHARTS.REAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n })\n\n element.empty()\n element.plot(data, options).data(\"plot\")\n\n link = ($scope, $el, $attrs) ->\n element = angular.element($el)\n\n $scope.$on \"resize\", ->\n redrawChart(element, $scope.stats.days) if $scope.stats\n\n $scope.$on \"taskboard:graph:toggle-visibility\", ->\n $el.parent().toggleClass('open')\n\n # fix chart overflow\n timeout(100, ->\n redrawChart(element, $scope.stats.days) if $scope.stats\n )\n\n $scope.$watch 'stats', (value) ->\n if not $scope.stats?\n return\n redrawChart(element, $scope.stats.days)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgSprintGraph\", [\"$translate\", SprintGraphDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard/lightboxes.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nCreateEditTaskDirective = ($repo, $model, $rs, $rootscope, $loading, lightboxService, $translate) ->\n link = ($scope, $el, attrs) ->\n $scope.isNew = true\n\n $scope.$on \"taskform:new\", (ctx, sprintId, usId) ->\n $scope.task = {\n project: $scope.projectId\n milestone: sprintId\n user_story: usId\n is_archived: false\n status: $scope.project.default_task_status\n assigned_to: null\n tags: []\n }\n $scope.isNew = true\n\n # Update texts for creation\n create = $translate.instant(\"COMMON.CREATE\")\n $el.find(\".button-green\").html(create)\n\n newTask = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.TITLE\")\n $el.find(\".title\").html(newTask + \" \")\n\n $el.find(\".tag-input\").val(\"\")\n lightboxService.open($el)\n\n $scope.$on \"taskform:edit\", (ctx, task) ->\n $scope.task = task\n $scope.isNew = false\n\n # Update texts for edition\n save = $translate.instant(\"COMMON.SAVE\")\n edit = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.ACTION_EDIT\")\n\n $el.find(\".button-green\").html(save)\n $el.find(\".title\").html(edit + \" \")\n\n $el.find(\".tag-input\").val(\"\")\n lightboxService.open($el)\n\n\n submitButton = $el.find(\".submit-button\")\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n if $scope.isNew\n promise = $repo.create(\"tasks\", $scope.task)\n broadcastEvent = \"taskform:new:success\"\n else\n promise = $repo.save($scope.task)\n broadcastEvent = \"taskform:edit:success\"\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n # FIXME: error handling?\n promise.then (data) ->\n currentLoading.finish()\n lightboxService.close($el)\n $rootscope.$broadcast(broadcastEvent, data)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nCreateBulkTasksDirective = ($repo, $rs, $rootscope, $loading, lightboxService) ->\n link = ($scope, $el, attrs) ->\n $scope.form = {data: \"\", usId: null}\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n data = $scope.form.data\n projectId = $scope.projectId\n sprintId = $scope.form.sprintId\n usId = $scope.form.usId\n\n promise = $rs.tasks.bulkCreate(projectId, sprintId, usId, data)\n promise.then (result) ->\n currentLoading.finish()\n $rootscope.$broadcast(\"taskform:bulk:success\", result)\n lightboxService.close($el)\n\n # TODO: error handling\n promise.then null, ->\n currentLoading.finish()\n console.log \"FAIL\"\n\n $scope.$on \"taskform:bulk\", (ctx, sprintId, usId)->\n lightboxService.open($el)\n $scope.form = {data: \"\", sprintId: sprintId, usId: usId}\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule = angular.module(\"taigaTaskboard\")\n\nmodule.directive(\"tgLbCreateEditTask\", [\n \"$tgRepo\",\n \"$tgModel\",\n \"$tgResources\",\n \"$rootScope\",\n \"$tgLoading\",\n \"lightboxService\",\n \"$translate\"\n CreateEditTaskDirective\n])\n\nmodule.directive(\"tgLbCreateBulkTasks\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n \"$tgLoading\",\n \"lightboxService\",\n CreateBulkTasksDirective\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard.coffee\n###\n\ntaiga = @.taiga\ntoggleText = @.taiga.toggleText\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nscopeDefer = @.taiga.scopeDefer\ntimeout = @.taiga.timeout\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaTaskboard\")\n\n\n#############################################################################\n## Taskboard Controller\n#############################################################################\n\nclass TaskboardController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"tgAppMetaService\",\n \"$tgLocation\",\n \"$tgNavUrls\"\n \"$tgEvents\"\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @appMetaService, @location, @navUrls,\n @events, @analytics, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"TASKBOARD.SECTION_NAME\")\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then => @._setMeta()\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n prettyDate = @translate.instant(\"BACKLOG.SPRINTS.DATE\")\n\n title = @translate.instant(\"TASKBOARD.PAGE_TITLE\", {\n projectName: @scope.project.name\n sprintName: @scope.sprint.name\n })\n description = @translate.instant(\"TASKBOARD.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name\n sprintName: @scope.sprint.name\n startDate: moment(@scope.sprint.estimated_start).format(prettyDate)\n endDate: moment(@scope.sprint.estimated_finish).format(prettyDate)\n completedPercentage: @scope.stats.completedPercentage or \"0\"\n completedPoints: @scope.stats.completedPointsSum or \"--\"\n totalPoints: @scope.stats.totalPointsSum or \"--\"\n openTasks: @scope.stats.openTasks or \"--\"\n totalTasks: @scope.stats.total_tasks or \"--\"\n })\n\n @appMetaService.setAll(title, description)\n\n initializeEventHandlers: ->\n # TODO: Reload entire taskboard after create/edit tasks seems\n # a big overhead. It should be optimized in near future.\n @scope.$on \"taskform:bulk:success\", =>\n @.loadTaskboard()\n @analytics.trackEvent(\"task\", \"create\", \"bulk create task on taskboard\", 1)\n\n @scope.$on \"taskform:new:success\", =>\n @.loadTaskboard()\n @analytics.trackEvent(\"task\", \"create\", \"create task on taskboard\", 1)\n\n @scope.$on(\"taskform:edit:success\", => @.loadTaskboard())\n @scope.$on(\"taskboard:task:move\", @.taskMove)\n\n @scope.$on \"assigned-to:added\", (ctx, userId, task) =>\n task.assigned_to = userId\n promise = @repo.save(task)\n promise.then null, ->\n console.log \"FAIL\" # TODO\n\n initializeSubscription: ->\n routingKey = \"changes.project.#{@scope.projectId}.tasks\"\n @events.subscribe @scope, routingKey, (message) =>\n @.loadTaskboard()\n\n routingKey1 = \"changes.project.#{@scope.projectId}.userstories\"\n @events.subscribe @scope, routingKey1, (message) =>\n @.refreshTagsColors()\n @.loadSprintStats()\n @.loadSprint()\n\n loadProject: ->\n return @rs.projects.get(@scope.projectId).then (project) =>\n if not project.is_backlog_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.project = project\n # Not used at this momment\n @scope.pointsList = _.sortBy(project.points, \"order\")\n # @scope.roleList = _.sortBy(project.roles, \"order\")\n @scope.pointsById = groupBy(project.points, (e) -> e.id)\n @scope.roleById = groupBy(project.roles, (e) -> e.id)\n @scope.taskStatusList = _.sortBy(project.task_statuses, \"order\")\n @scope.usStatusList = _.sortBy(project.us_statuses, \"order\")\n @scope.usStatusById = groupBy(project.us_statuses, (e) -> e.id)\n\n @scope.$emit('project:loaded', project)\n\n @.fillUsersAndRoles(project.members, project.roles)\n\n return project\n\n loadSprintStats: ->\n return @rs.sprints.stats(@scope.projectId, @scope.sprintId).then (stats) =>\n totalPointsSum =_.reduce(_.values(stats.total_points), ((res, n) -> res + n), 0)\n completedPointsSum = _.reduce(_.values(stats.completed_points), ((res, n) -> res + n), 0)\n remainingPointsSum = totalPointsSum - completedPointsSum\n remainingTasks = stats.total_tasks - stats.completed_tasks\n @scope.stats = stats\n @scope.stats.totalPointsSum = totalPointsSum\n @scope.stats.completedPointsSum = completedPointsSum\n @scope.stats.remainingPointsSum = remainingPointsSum\n @scope.stats.remainingTasks = remainingTasks\n if stats.totalPointsSum\n @scope.stats.completedPercentage = Math.round(100*stats.completedPointsSum/stats.totalPointsSum)\n else\n @scope.stats.completedPercentage = 0\n\n @scope.stats.openTasks = stats.total_tasks - stats.completed_tasks\n return stats\n\n refreshTagsColors: ->\n return @rs.projects.tagsColors(@scope.projectId).then (tags_colors) =>\n @scope.project.tags_colors = tags_colors\n\n loadSprint: ->\n return @rs.sprints.get(@scope.projectId, @scope.sprintId).then (sprint) =>\n @scope.sprint = sprint\n @scope.userstories = _.sortBy(sprint.user_stories, \"sprint_order\")\n return sprint\n\n loadTasks: ->\n return @rs.tasks.list(@scope.projectId, @scope.sprintId).then (tasks) =>\n @scope.tasks = _.sortBy(tasks, 'taskboard_order')\n @scope.usTasks = {}\n\n # Iterate over all userstories and\n # null userstory for unassigned tasks\n for us in _.union(@scope.userstories, [{id:null}])\n @scope.usTasks[us.id] = {}\n for status in @scope.taskStatusList\n @scope.usTasks[us.id][status.id] = []\n\n for task in @scope.tasks\n if @scope.usTasks[task.user_story]? and @scope.usTasks[task.user_story][task.status]?\n @scope.usTasks[task.user_story][task.status].push(task)\n\n if tasks.length == 0\n \n if @scope.userstories.length > 0\n usId = @scope.userstories[0].id\n else\n usId = null\n\n @scope.usTasks[usId][@scope.taskStatusList[0].id].push({isPlaceholder: true})\n\n return tasks\n\n loadTaskboard: ->\n return @q.all([\n @.refreshTagsColors(),\n @.loadSprintStats(),\n @.loadSprint().then(=> @.loadTasks())\n ])\n\n loadInitialData: ->\n params = {\n pslug: @params.pslug\n sslug: @params.sslug\n }\n\n promise = @repo.resolve(params).then (data) =>\n @scope.projectId = data.project\n @scope.sprintId = data.milestone\n @.initializeSubscription()\n return data\n\n return promise.then(=> @.loadProject())\n .then(=> @.loadTaskboard())\n\n refreshTasksOrder: (tasks) ->\n items = @.resortTasks(tasks)\n data = @.prepareBulkUpdateData(items)\n\n return @rs.tasks.bulkUpdateTaskTaskboardOrder(@scope.project.id, data)\n\n resortTasks: (tasks) ->\n items = []\n\n for item, index in tasks\n item[\"taskboard_order\"] = index\n if item.isModified()\n items.push(item)\n\n return items\n\n prepareBulkUpdateData: (uses) ->\n return _.map(uses, (x) -> {\"task_id\": x.id, \"order\": x[\"taskboard_order\"]})\n\n taskMove: (ctx, task, usId, statusId, order) ->\n # Remove task from old position\n r = @scope.usTasks[task.user_story][task.status].indexOf(task)\n @scope.usTasks[task.user_story][task.status].splice(r, 1)\n\n # Add task to new position\n tasks = @scope.usTasks[usId][statusId]\n tasks.splice(order, 0, task)\n\n task.user_story = usId\n task.status = statusId\n task.taskboard_order = order\n\n promise = @repo.save(task)\n\n @rootscope.$broadcast(\"sprint:task:moved\", task)\n\n promise.then =>\n @.refreshTasksOrder(tasks)\n @.loadSprintStats()\n\n promise.then null, =>\n console.log \"FAIL TASK SAVE\"\n\n ## Template actions\n addNewTask: (type, us) ->\n switch type\n when \"standard\" then @rootscope.$broadcast(\"taskform:new\", @scope.sprintId, us?.id)\n when \"bulk\" then @rootscope.$broadcast(\"taskform:bulk\", @scope.sprintId, us?.id)\n\n editTaskAssignedTo: (task) ->\n @rootscope.$broadcast(\"assigned-to:add\", task)\n\nmodule.controller(\"TaskboardController\", TaskboardController)\n\n\n#############################################################################\n## TaskboardDirective\n#############################################################################\n\nTaskboardDirective = ($rootscope) ->\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n $el.on \"click\", \".toggle-analytics-visibility\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.toggleClass('active')\n $rootscope.$broadcast(\"taskboard:graph:toggle-visibility\")\n\n tableBodyDom = $el.find(\".taskboard-table-body\")\n tableBodyDom.on \"scroll\", (event) ->\n target = angular.element(event.currentTarget)\n tableHeaderDom = $el.find(\".taskboard-table-header .taskboard-table-inner\")\n tableHeaderDom.css(\"left\", -1 * target.scrollLeft())\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgTaskboard\", [\"$rootScope\", TaskboardDirective])\n\n\n#############################################################################\n## Taskboard Task Directive\n#############################################################################\n\nTaskboardTaskDirective = ($rootscope, $loading, $rs) ->\n link = ($scope, $el, $attrs, $model) ->\n $el.disableSelection()\n\n $scope.$watch \"task\", (task) ->\n if task.is_blocked and not $el.hasClass(\"blocked\")\n $el.addClass(\"blocked\")\n else if not task.is_blocked and $el.hasClass(\"blocked\")\n $el.removeClass(\"blocked\")\n\n $el.find(\".icon-edit\").on \"click\", (event) ->\n if $el.find('.icon-edit').hasClass('noclick')\n return\n $scope.$apply ->\n target = $(event.target)\n\n currentLoading = $loading()\n .target(target)\n .timeout(200)\n .removeClasses(\"icon-edit\")\n .start()\n\n task = $scope.task\n $rs.tasks.getByRef(task.project, task.ref).then (editingTask) =>\n $rootscope.$broadcast(\"taskform:edit\", editingTask)\n currentLoading.finish()\n\n return {link:link}\n\n\nmodule.directive(\"tgTaskboardTask\", [\"$rootScope\", \"$tgLoading\", \"$tgResources\", TaskboardTaskDirective])\n\n#############################################################################\n## Taskboard Squish Column Directive\n#############################################################################\n\nTaskboardSquishColumnDirective = (rs) ->\n avatarWidth = 40\n maxColumnWidth = 300\n\n link = ($scope, $el, $attrs) ->\n $scope.$on \"sprint:task:moved\", () =>\n recalculateTaskboardWidth()\n\n bindOnce $scope, \"usTasks\", (project) ->\n $scope.statusesFolded = rs.tasks.getStatusColumnModes($scope.project.id)\n $scope.usFolded = rs.tasks.getUsRowModes($scope.project.id, $scope.sprintId)\n\n recalculateTaskboardWidth()\n\n $scope.foldStatus = (status) ->\n $scope.statusesFolded[status.id] = !!!$scope.statusesFolded[status.id]\n rs.tasks.storeStatusColumnModes($scope.projectId, $scope.statusesFolded)\n\n recalculateTaskboardWidth()\n\n $scope.foldUs = (us) ->\n if !us\n $scope.usFolded[null] = !!!$scope.usFolded[null]\n else\n $scope.usFolded[us.id] = !!!$scope.usFolded[us.id]\n\n rs.tasks.storeUsRowModes($scope.projectId, $scope.sprintId, $scope.usFolded)\n\n recalculateTaskboardWidth()\n\n getCeilWidth = (usId, statusId) =>\n tasks = $scope.usTasks[usId][statusId].length\n\n if $scope.statusesFolded[statusId]\n if tasks and $scope.usFolded[usId]\n tasksMatrixSize = Math.round(Math.sqrt(tasks))\n width = avatarWidth * tasksMatrixSize\n else\n width = avatarWidth\n\n return width\n\n return 0\n\n setStatusColumnWidth = (statusId, width) =>\n column = $el.find(\".squish-status-#{statusId}\")\n\n if width\n column.css('max-width', width)\n else\n column.css(\"max-width\", maxColumnWidth)\n\n refreshTaskboardTableWidth = () =>\n columnWidths = []\n\n columns = $el.find(\".task-colum-name\")\n\n columnWidths = _.map columns, (column) ->\n return $(column).outerWidth(true)\n\n totalWidth = _.reduce columnWidths, (total, width) ->\n return total + width\n\n $el.find('.taskboard-table-inner').css(\"width\", totalWidth)\n\n recalculateStatusColumnWidth = (statusId) =>\n #unassigned ceil\n statusFoldedWidth = getCeilWidth(null, statusId)\n\n _.forEach $scope.userstories, (us) ->\n width = getCeilWidth(us.id, statusId)\n statusFoldedWidth = width if width > statusFoldedWidth\n\n setStatusColumnWidth(statusId, statusFoldedWidth)\n\n recalculateTaskboardWidth = () =>\n _.forEach $scope.taskStatusList, (status) ->\n recalculateStatusColumnWidth(status.id)\n\n refreshTaskboardTableWidth()\n\n return\n\n return {link: link}\n\nmodule.directive(\"tgTaskboardSquishColumn\", [\"$tgResources\", TaskboardSquishColumnDirective])\n\n#############################################################################\n## Taskboard User Directive\n#############################################################################\n\nTaskboardUserDirective = ($log) ->\n clickable = false\n\n link = ($scope, $el, $attrs) ->\n username_label = $el.parent().find(\"a.task-assigned\")\n username_label.addClass(\"not-clickable\")\n\n $scope.$watch 'task.assigned_to', (assigned_to) ->\n user = $scope.usersById[assigned_to]\n\n if user is undefined\n _.assign($scope, {name: \"Unassigned\", imgurl: \"/images/unnamed.png\", clickable: clickable})\n else\n _.assign($scope, {name: user.full_name_display, imgurl: user.photo, clickable: clickable})\n\n username_label.text($scope.name)\n\n\n bindOnce $scope, \"project\", (project) ->\n if project.my_permissions.indexOf(\"modify_task\") > -1\n clickable = true\n $el.find(\".avatar-assigned-to\").on \"click\", (event) =>\n if $el.find('a').hasClass('noclick')\n return\n\n $ctrl = $el.controller()\n $ctrl.editTaskAssignedTo($scope.task)\n\n username_label.removeClass(\"not-clickable\")\n username_label.on \"click\", (event) ->\n if $el.find('a').hasClass('noclick')\n return\n\n $ctrl = $el.controller()\n $ctrl.editTaskAssignedTo($scope.task)\n\n\n return {\n link: link,\n templateUrl: \"taskboard/taskboard-user.html\",\n scope: {\n \"usersById\": \"=users\",\n \"project\": \"=\",\n \"task\": \"=\",\n }\n }\n\n\nmodule.directive(\"tgTaskboardUserAvatar\", [\"$log\", TaskboardUserDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/taskboard/sortable.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\n\nmodule = angular.module(\"taigaBacklog\")\n\n\n#############################################################################\n## Sortable Directive\n#############################################################################\n\nTaskboardSortableDirective = ($repo, $rs, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions we don't enable the sortable\n if not (project.my_permissions.indexOf(\"modify_us\") > -1)\n return\n\n oldParentScope = null\n newParentScope = null\n itemEl = null\n tdom = $el\n\n deleteElement = (itemEl) ->\n # Completelly remove item and its scope from dom\n itemEl.scope().$destroy()\n itemEl.off()\n itemEl.remove()\n\n tdom.sortable({\n handle: \".taskboard-task-inner\",\n dropOnEmpty: true\n connectWith: \".taskboard-tasks-box\"\n revert: 400\n })\n\n tdom.on \"sortstop\", (event, ui) ->\n parentEl = ui.item.parent()\n itemEl = ui.item\n itemTask = itemEl.scope().task\n itemIndex = itemEl.index()\n newParentScope = parentEl.scope()\n\n oldUsId = if oldParentScope.us then oldParentScope.us.id else null\n oldStatusId = oldParentScope.st.id\n newUsId = if newParentScope.us then newParentScope.us.id else null\n newStatusId = newParentScope.st.id\n\n if newStatusId != oldStatusId or newUsId != oldUsId\n deleteElement(itemEl)\n\n $scope.$apply ->\n $rootscope.$broadcast(\"taskboard:task:move\", itemTask, newUsId, newStatusId, itemIndex)\n\n ui.item.find('a').removeClass('noclick')\n\n tdom.on \"sortstart\", (event, ui) ->\n oldParentScope = ui.item.parent().scope()\n ui.item.find('a').addClass('noclick')\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgTaskboardSortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n TaskboardSortableDirective\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/kanban/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ntimeout = @.taiga.timeout\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaKanban\")\n\n# Vars\n\ndefaultViewMode = \"maximized\"\nviewModes = [\n \"maximized\",\n \"minimized\"\n]\n\n\n#############################################################################\n## Kanban Controller\n#############################################################################\n\nclass KanbanController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgEvents\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location,\n @appMetaService, @navUrls, @events, @analytics, @translate) ->\n\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"KANBAN.SECTION_NAME\")\n @scope.statusViewModes = {}\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n title = @translate.instant(\"KANBAN.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"KANBAN.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n initializeEventHandlers: ->\n @scope.$on \"usform:new:success\", =>\n @.loadUserstories()\n @.refreshTagsColors()\n @analytics.trackEvent(\"userstory\", \"create\", \"create userstory on kanban\", 1)\n\n @scope.$on \"usform:bulk:success\", =>\n @.loadUserstories()\n @analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on kanban\", 1)\n\n @scope.$on \"usform:edit:success\", =>\n @.loadUserstories()\n @.refreshTagsColors()\n\n @scope.$on(\"assigned-to:added\", @.onAssignedToChanged)\n @scope.$on(\"kanban:us:move\", @.moveUs)\n @scope.$on(\"kanban:show-userstories-for-status\", @.loadUserStoriesForStatus)\n @scope.$on(\"kanban:hide-userstories-for-status\", @.hideUserStoriesForStatus)\n\n # Template actions\n\n addNewUs: (type, statusId) ->\n switch type\n when \"standard\" then @rootscope.$broadcast(\"usform:new\", @scope.projectId, statusId, @scope.usStatusList)\n when \"bulk\" then @rootscope.$broadcast(\"usform:bulk\", @scope.projectId, statusId)\n\n changeUsAssignedTo: (us) ->\n @rootscope.$broadcast(\"assigned-to:add\", us)\n\n # Scope Events Handlers\n\n onAssignedToChanged: (ctx, userid, us) ->\n us.assigned_to = userid\n\n promise = @repo.save(us)\n promise.then null, ->\n console.log \"FAIL\" # TODO\n\n # Load data methods\n refreshTagsColors: ->\n return @rs.projects.tagsColors(@scope.projectId).then (tags_colors) =>\n @scope.project.tags_colors = tags_colors\n\n loadUserstories: ->\n params = {\n status__is_archived: false\n }\n\n return @rs.userstories.listAll(@scope.projectId, params).then (userstories) =>\n @scope.userstories = userstories\n\n usByStatus = _.groupBy(userstories, \"status\")\n us_archived = []\n for status in @scope.usStatusList\n if not usByStatus[status.id]?\n usByStatus[status.id] = []\n if @scope.usByStatus?\n for us in @scope.usByStatus[status.id]\n if us.status != status.id\n us_archived.push(us)\n\n # Must preserve the archived columns if loaded\n if status.is_archived and @scope.usByStatus? and @scope.usByStatus[status.id].length != 0\n for us in @scope.usByStatus[status.id].concat(us_archived)\n if us.status == status.id\n usByStatus[status.id].push(us)\n\n usByStatus[status.id] = _.sortBy(usByStatus[status.id], \"kanban_order\")\n\n if userstories.length == 0\n status = @scope.usStatusList[0]\n usByStatus[status.id].push({isPlaceholder: true})\n\n @scope.usByStatus = usByStatus\n\n # The broadcast must be executed when the DOM has been fully reloaded.\n # We can't assure when this exactly happens so we need a defer\n scopeDefer @scope, =>\n @scope.$broadcast(\"userstories:loaded\", userstories)\n\n return userstories\n\n loadUserStoriesForStatus: (ctx, statusId) ->\n params = { status: statusId }\n return @rs.userstories.listAll(@scope.projectId, params).then (userstories) =>\n @scope.usByStatus[statusId] = _.sortBy(userstories, \"kanban_order\")\n @scope.$broadcast(\"kanban:shown-userstories-for-status\", statusId, userstories)\n return userstories\n\n hideUserStoriesForStatus: (ctx, statusId) ->\n @scope.usByStatus[statusId] = []\n @scope.$broadcast(\"kanban:hidden-userstories-for-status\", statusId)\n\n loadKanban: ->\n return @q.all([\n @.refreshTagsColors(),\n @.loadUserstories()\n ])\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.is_kanban_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.projectId = project.id\n @scope.points = _.sortBy(project.points, \"order\")\n @scope.pointsById = groupBy(project.points, (x) -> x.id)\n @scope.usStatusById = groupBy(project.us_statuses, (x) -> x.id)\n @scope.usStatusList = _.sortBy(project.us_statuses, \"order\")\n\n @.generateStatusViewModes()\n\n @scope.$emit(\"project:loaded\", project)\n return project\n\n initializeSubscription: ->\n routingKey1 = \"changes.project.#{@scope.projectId}.userstories\"\n @events.subscribe @scope, routingKey1, (message) =>\n @.loadUserstories()\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.initializeSubscription()\n @.loadKanban().then( => @scope.$broadcast(\"redraw:wip\"))\n\n\n ## View Mode methods\n\n generateStatusViewModes: ->\n storedStatusViewModes = @rs.kanban.getStatusViewModes(@scope.projectId)\n\n @scope.statusViewModes = {}\n for status in @scope.usStatusList\n mode = storedStatusViewModes[status.id] || defaultViewMode\n\n @scope.statusViewModes[status.id] = mode\n\n @.storeStatusViewModes()\n\n storeStatusViewModes: ->\n @rs.kanban.storeStatusViewModes(@scope.projectId, @scope.statusViewModes)\n\n updateStatusViewMode: (statusId, newViewMode) ->\n @scope.statusViewModes[statusId] = newViewMode\n @.storeStatusViewModes()\n\n isMaximized: (statusId) ->\n mode = @scope.statusViewModes[statusId] or defaultViewMode\n return mode == 'maximized'\n\n isMinimized: (statusId) ->\n mode = @scope.statusViewModes[statusId] or defaultViewMode\n return mode == 'minimized'\n\n # Utils methods\n\n prepareBulkUpdateData: (uses, field=\"kanban_order\") ->\n return _.map(uses, (x) -> {\"us_id\": x.id, \"order\": x[field]})\n\n resortUserStories: (uses) ->\n items = []\n for item, index in uses\n item.kanban_order = index\n if item.isModified()\n items.push(item)\n\n return items\n\n moveUs: (ctx, us, oldStatusId, newStatusId, index) ->\n if oldStatusId != newStatusId\n # Remove us from old status column\n r = @scope.usByStatus[oldStatusId].indexOf(us)\n @scope.usByStatus[oldStatusId].splice(r, 1)\n\n # Add us to new status column.\n @scope.usByStatus[newStatusId].splice(index, 0, us)\n us.status = newStatusId\n else\n r = @scope.usByStatus[newStatusId].indexOf(us)\n @scope.usByStatus[newStatusId].splice(r, 1)\n @scope.usByStatus[newStatusId].splice(index, 0, us)\n\n itemsToSave = @.resortUserStories(@scope.usByStatus[newStatusId])\n @scope.usByStatus[newStatusId] = _.sortBy(@scope.usByStatus[newStatusId], \"kanban_order\")\n\n # Persist the userstory\n promise = @repo.save(us)\n\n # Rehash userstories order field\n # and persist in bulk all changes.\n promise = promise.then =>\n itemsToSave = _.reject(itemsToSave, {\"id\": us.id})\n data = @.prepareBulkUpdateData(itemsToSave)\n\n return @rs.userstories.bulkUpdateKanbanOrder(us.project, data).then =>\n return itemsToSave\n\n return promise\n\n\nmodule.controller(\"KanbanController\", KanbanController)\n\n#############################################################################\n## Kanban Directive\n#############################################################################\n\nKanbanDirective = ($repo, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n tableBodyDom = $el.find(\".kanban-table-body\")\n\n tableBodyDom.on \"scroll\", (event) ->\n target = angular.element(event.currentTarget)\n tableHeaderDom = $el.find(\".kanban-table-header .kanban-table-inner\")\n tableHeaderDom.css(\"left\", -1 * target.scrollLeft())\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgKanban\", [\"$tgRepo\", \"$rootScope\", KanbanDirective])\n\n#############################################################################\n## Kanban Archived Status Column Header Control\n#############################################################################\n\nKanbanArchivedStatusHeaderDirective = ($rootscope, $translate) ->\n showArchivedText = $translate.instant(\"KANBAN.ACTION_SHOW_ARCHIVED\")\n hideArchivedText = $translate.instant(\"KANBAN.ACTION_HIDE_ARCHIVED\")\n\n link = ($scope, $el, $attrs) ->\n status = $scope.$eval($attrs.tgKanbanArchivedStatusHeader)\n hidden = true\n\n $scope.class = \"icon-open-eye\"\n $scope.title = showArchivedText\n\n $el.on \"click\", (event) ->\n hidden = not hidden\n\n $scope.$apply ->\n if hidden\n $scope.class = \"icon-open-eye\"\n $scope.title = showArchivedText\n $rootscope.$broadcast(\"kanban:hide-userstories-for-status\", status.id)\n\n else\n $scope.class = \"icon-closed-eye\"\n $scope.title = hideArchivedText\n $rootscope.$broadcast(\"kanban:show-userstories-for-status\", status.id)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgKanbanArchivedStatusHeader\", [ \"$rootScope\", \"$translate\", KanbanArchivedStatusHeaderDirective])\n\n\n#############################################################################\n## Kanban Archived Status Column Intro Directive\n#############################################################################\n\nKanbanArchivedStatusIntroDirective = ($translate) ->\n userStories = []\n\n link = ($scope, $el, $attrs) ->\n hiddenUserStoriexText = $translate.instant(\"KANBAN.HIDDEN_USER_STORIES\")\n status = $scope.$eval($attrs.tgKanbanArchivedStatusIntro)\n $el.text(hiddenUserStoriexText)\n\n updateIntroText = ->\n if userStories.length > 0\n $el.text(\"\")\n else\n $el.text(hiddenUserStoriexText)\n\n $scope.$on \"kanban:us:move\", (ctx, itemUs, oldStatusId, newStatusId, itemIndex) ->\n # The destination columnd is this one\n if status.id == newStatusId\n # Reorder\n if status.id == oldStatusId\n r = userStories.indexOf(itemUs)\n userStories.splice(r, 1)\n userStories.splice(itemIndex, 0, itemUs)\n\n # Archiving user story\n else\n itemUs.isArchived = true\n userStories.splice(itemIndex, 0, itemUs)\n\n # Unarchiving user story\n else if status.id == oldStatusId\n itemUs.isArchived = false\n r = userStories.indexOf(itemUs)\n userStories.splice(r, 1)\n\n updateIntroText()\n\n $scope.$on \"kanban:shown-userstories-for-status\", (ctx, statusId, userStoriesLoaded) ->\n if statusId == status.id\n userStories = _.filter(userStoriesLoaded, (us) -> us.status == status.id)\n updateIntroText()\n\n $scope.$on \"kanban:hidden-userstories-for-status\", (ctx, statusId) ->\n if statusId == status.id\n userStories = []\n updateIntroText()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgKanbanArchivedStatusIntro\", [\"$translate\", KanbanArchivedStatusIntroDirective])\n\n\n#############################################################################\n## Kanban User Story Directive\n#############################################################################\n\nKanbanUserstoryDirective = ($rootscope, $loading, $rs) ->\n link = ($scope, $el, $attrs, $model) ->\n $el.disableSelection()\n\n $scope.$watch \"us\", (us) ->\n if us.is_blocked and not $el.hasClass(\"blocked\")\n $el.addClass(\"blocked\")\n else if not us.is_blocked and $el.hasClass(\"blocked\")\n $el.removeClass(\"blocked\")\n\n $el.on 'click', '.icon-edit', (event) ->\n if $el.find(\".icon-edit\").hasClass(\"noclick\")\n return\n\n target = $(event.target)\n\n currentLoading = $loading()\n .target(target)\n .timeout(200)\n .removeClasses(\"icon-edit\")\n .start()\n\n us = $model.$modelValue\n $rs.userstories.getByRef(us.project, us.ref).then (editingUserStory) =>\n $rootscope.$broadcast(\"usform:edit\", editingUserStory)\n currentLoading.finish()\n\n $scope.getTemplateUrl = () ->\n if $scope.us.isPlaceholder\n return \"common/components/kanban-placeholder.html\"\n else\n return \"kanban/kanban-task.html\"\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n template: '',\n link: link\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgKanbanUserstory\", [\"$rootScope\", \"$tgLoading\", \"$tgResources\", KanbanUserstoryDirective])\n\n#############################################################################\n## Kanban Squish Column Directive\n#############################################################################\n\nKanbanSquishColumnDirective = (rs) ->\n\n link = ($scope, $el, $attrs) ->\n $scope.$on \"project:loaded\", (event, project) ->\n $scope.folds = rs.kanban.getStatusColumnModes(project.id)\n updateTableWidth()\n\n $scope.foldStatus = (status) ->\n $scope.folds[status.id] = !!!$scope.folds[status.id]\n rs.kanban.storeStatusColumnModes($scope.projectId, $scope.folds)\n updateTableWidth()\n return\n\n updateTableWidth = ->\n columnWidths = _.map $scope.usStatusList, (status) ->\n if $scope.folds[status.id]\n return 40\n else\n return 310\n totalWidth = _.reduce columnWidths, (total, width) ->\n return total + width\n $el.find('.kanban-table-inner').css(\"width\", totalWidth)\n\n return {link: link}\n\nmodule.directive(\"tgKanbanSquishColumn\", [\"$tgResources\", KanbanSquishColumnDirective])\n\n#############################################################################\n## Kanban WIP Limit Directive\n#############################################################################\n\nKanbanWipLimitDirective = ->\n link = ($scope, $el, $attrs) ->\n $el.disableSelection()\n\n status = $scope.$eval($attrs.tgKanbanWipLimit)\n\n redrawWipLimit = =>\n $el.find(\".kanban-wip-limit\").remove()\n timeout 200, =>\n element = $el.find(\".kanban-task\")[status.wip_limit]\n if element\n angular.element(element).before(\"
\")\n\n if status and not status.is_archived\n $scope.$on \"redraw:wip\", redrawWipLimit\n $scope.$on \"kanban:us:move\", redrawWipLimit\n $scope.$on \"usform:new:success\", redrawWipLimit\n $scope.$on \"usform:bulk:success\", redrawWipLimit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgKanbanWipLimit\", KanbanWipLimitDirective)\n\n\n#############################################################################\n## Kanban User Directive\n#############################################################################\n\nKanbanUserDirective = ($log, $compile) ->\n template = _.template(\"\"\"\n
\n class=\"not-clickable\"<% } %>>\n \" alt=\"<%- name %>\" class=\"avatar\">\n \n
\n \"\"\")\n\n clickable = false\n\n link = ($scope, $el, $attrs, $model) ->\n username_label = $el.parent().find(\"a.task-assigned\")\n username_label.addClass(\"not-clickable\")\n\n if not $attrs.tgKanbanUserAvatar\n return $log.error \"KanbanUserDirective: no attr is defined\"\n\n wtid = $scope.$watch $attrs.tgKanbanUserAvatar, (v) ->\n if not $scope.usersById?\n $log.error \"KanbanUserDirective requires userById set in scope.\"\n wtid()\n else\n user = $scope.usersById[v]\n render(user)\n\n render = (user) ->\n if user is undefined\n ctx = {name: \"Unassigned\", imgurl: \"/images/unnamed.png\", clickable: clickable}\n else\n ctx = {name: user.full_name_display, imgurl: user.photo, clickable: clickable}\n\n html = $compile(template(ctx))($scope)\n $el.html(html)\n username_label.text(ctx.name)\n\n bindOnce $scope, \"project\", (project) ->\n if project.my_permissions.indexOf(\"modify_us\") > -1\n clickable = true\n $el.on \"click\", (event) =>\n if $el.find(\"a\").hasClass(\"noclick\")\n return\n\n us = $model.$modelValue\n $ctrl = $el.controller()\n $ctrl.changeUsAssignedTo(us)\n\n username_label.removeClass(\"not-clickable\")\n username_label.on \"click\", (event) ->\n if $el.find(\"a\").hasClass(\"noclick\")\n return\n\n us = $model.$modelValue\n $ctrl = $el.controller()\n $ctrl.changeUsAssignedTo(us)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link, require:\"ngModel\"}\n\nmodule.directive(\"tgKanbanUserAvatar\", [\"$log\", \"$compile\", KanbanUserDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/kanban/sortable.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoggleText = @.taiga.toggleText\nscopeDefer = @.taiga.scopeDefer\nbindOnce = @.taiga.bindOnce\ngroupBy = @.taiga.groupBy\ntimeout = @.taiga.timeout\n\nmodule = angular.module(\"taigaKanban\")\n\n\n#############################################################################\n## Sortable Directive\n#############################################################################\n\nKanbanSortableDirective = ($repo, $rs, $rootscope) ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, \"project\", (project) ->\n if not (project.my_permissions.indexOf(\"modify_us\") > -1)\n return\n\n oldParentScope = null\n newParentScope = null\n itemEl = null\n tdom = $el\n\n deleteElement = (itemEl) ->\n # Completelly remove item and its scope from dom\n itemEl.scope().$destroy()\n itemEl.off()\n itemEl.remove()\n\n tdom.sortable({\n handle: \".kanban-task-inner\"\n dropOnEmpty: true\n connectWith: \".kanban-uses-box\"\n revert: 400\n })\n\n tdom.on \"sortstop\", (event, ui) ->\n parentEl = ui.item.parent()\n itemEl = ui.item\n itemUs = itemEl.scope().us\n itemIndex = itemEl.index()\n newParentScope = parentEl.scope()\n\n newStatusId = newParentScope.s.id\n oldStatusId = oldParentScope.s.id\n\n if newStatusId != oldStatusId\n deleteElement(itemEl)\n\n $scope.$apply ->\n $rootscope.$broadcast(\"kanban:us:move\", itemUs, itemUs.status, newStatusId, itemIndex)\n\n ui.item.find('a').removeClass('noclick')\n\n tdom.on \"sortstart\", (event, ui) ->\n oldParentScope = ui.item.parent().scope()\n ui.item.find('a').addClass('noclick')\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgKanbanSortable\", [\n \"$tgRepo\",\n \"$tgResources\",\n \"$rootScope\",\n KanbanSortableDirective\n])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntoString = @.taiga.toString\njoinStr = @.taiga.joinStr\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaIssues\")\n\n#############################################################################\n## Issue Detail Controller\n#############################################################################\n\nclass IssueDetailController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$log\",\n \"tgAppMetaService\",\n \"$tgAnalytics\",\n \"$tgNavUrls\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location,\n @log, @appMetaService, @analytics, @navUrls, @translate) ->\n bindMethods(@)\n\n @scope.issueRef = @params.issueref\n @scope.sectionName = @translate.instant(\"ISSUES.SECTION_NAME\")\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n @._setMeta()\n @.initializeOnDeleteGoToUrl()\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n title = @translate.instant(\"ISSUE.PAGE_TITLE\", {\n issueRef: \"##{@scope.issue.ref}\"\n issueSubject: @scope.issue.subject\n projectName: @scope.project.name\n })\n description = @translate.instant(\"ISSUE.PAGE_DESCRIPTION\", {\n issueStatus: @scope.statusById[@scope.issue.status]?.name or \"--\"\n issueType: @scope.typeById[@scope.issue.type]?.name or \"--\"\n issueSeverity: @scope.severityById[@scope.issue.severity]?.name or \"--\"\n issuePriority: @scope.priorityById[@scope.issue.priority]?.name or \"--\"\n issueDescription: angular.element(@scope.issue.description_html or \"\").text()\n })\n @appMetaService.setAll(title, description)\n\n initializeEventHandlers: ->\n @scope.$on \"attachment:create\", =>\n @analytics.trackEvent(\"attachment\", \"create\", \"create attachment on issue\", 1)\n\n @scope.$on \"promote-issue-to-us:success\", =>\n @analytics.trackEvent(\"issue\", \"promoteToUserstory\", \"promote issue to userstory\", 1)\n @rootscope.$broadcast(\"object:updated\")\n @.loadIssue()\n\n @scope.$on \"comment:new\", =>\n @.loadIssue()\n\n @scope.$on \"custom-attributes-values:edit\", =>\n @rootscope.$broadcast(\"object:updated\")\n\n initializeOnDeleteGoToUrl: ->\n ctx = {project: @scope.project.slug}\n if @scope.project.is_issues_activated\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-issues\", ctx)\n else\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project\", ctx)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.statusList = project.issue_statuses\n @scope.statusById = groupBy(project.issue_statuses, (x) -> x.id)\n @scope.typeById = groupBy(project.issue_types, (x) -> x.id)\n @scope.typeList = _.sortBy(project.issue_types, \"order\")\n @scope.severityList = project.severities\n @scope.severityById = groupBy(project.severities, (x) -> x.id)\n @scope.priorityList = project.priorities\n @scope.priorityById = groupBy(project.priorities, (x) -> x.id)\n return project\n\n loadIssue: ->\n return @rs.issues.getByRef(@scope.projectId, @params.issueref).then (issue) =>\n @scope.issue = issue\n @scope.issueId = issue.id\n @scope.commentModel = issue\n\n if @scope.issue.neighbors.previous.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.issue.neighbors.previous.ref\n }\n @scope.previousUrl = @navUrls.resolve(\"project-issues-detail\", ctx)\n\n if @scope.issue.neighbors.next.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.issue.neighbors.next.ref\n }\n @scope.nextUrl = @navUrls.resolve(\"project-issues-detail\", ctx)\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.loadIssue()\n\n ###\n # Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n # See app/modules/components/vote-button for more info\n ###\n onUpvote: ->\n onSuccess = =>\n @.loadIssue()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.issues.upvote(@scope.issueId).then(onSuccess, onError)\n\n onDownvote: ->\n onSuccess = =>\n @.loadIssue()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.issues.downvote(@scope.issueId).then(onSuccess, onError)\n\n ###\n # Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n # See app/modules/components/watch-button for more info\n ###\n onWatch: ->\n onSuccess = =>\n @.loadIssue()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.issues.watch(@scope.issueId).then(onSuccess, onError)\n\n onUnwatch: ->\n onSuccess = =>\n @.loadIssue()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.issues.unwatch(@scope.issueId).then(onSuccess, onError)\n\nmodule.controller(\"IssueDetailController\", IssueDetailController)\n\n\n#############################################################################\n## Issue status display directive\n#############################################################################\n\nIssueStatusDisplayDirective = ($template, $compile)->\n # Display if a Issue is open or closed and its issueboard status.\n #\n # Example:\n # tg-issue-status-display(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.statusById object\n\n template = $template.get(\"common/components/status-display.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (issue) ->\n status = $scope.statusById[issue.status]\n\n html = template({\n is_closed: status.is_closed\n status: status\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssueStatusDisplay\", [\"$tgTemplate\", \"$compile\", IssueStatusDisplayDirective])\n\n\n#############################################################################\n## Issue status button directive\n#############################################################################\n\nIssueStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->\n # Display the status of Issue and you can edit it.\n #\n # Example:\n # tg-issue-status-button(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.statusById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"issue/issues-status-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_issue\") != -1\n\n render = (issue) =>\n status = $scope.statusById[issue.status]\n\n html = template({\n status: status\n statuses: $scope.statusList\n editable: isEditable()\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (statusId) =>\n $.fn.popover().closeAll()\n\n issue = $model.$modelValue.clone()\n issue.status = statusId\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(issue)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n onError = ->\n $confirm.notify(\"error\")\n issue.revert()\n $model.$setViewValue(issue)\n currentLoading.finish()\n\n\n $repo.save(issue).then(onSuccess, onError)\n\n $el.on \"click\", \".status-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n\n save(target.data(\"status-id\"))\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssueStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueStatusButtonDirective])\n\n#############################################################################\n## Issue type button directive\n#############################################################################\n\nIssueTypeButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->\n # Display the type of Issue and you can edit it.\n #\n # Example:\n # tg-issue-type-button(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.typeById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"issue/issue-type-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_issue\") != -1\n\n render = (issue) =>\n type = $scope.typeById[issue.type]\n\n html = template({\n type: type\n typees: $scope.typeList\n editable: isEditable()\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (type) =>\n $.fn.popover().closeAll()\n issue = $model.$modelValue.clone()\n issue.type = type\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(issue)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n\n onError = ->\n $confirm.notify(\"error\")\n issue.revert()\n $model.$setViewValue(issue)\n currentLoading.finish()\n\n $repo.save(issue).then(onSuccess, onError)\n\n $el.on \"click\", \".type-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-type\").popover().open()\n\n $el.on \"click\", \".type\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n type = target.data(\"type-id\")\n save(type)\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssueTypeButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueTypeButtonDirective])\n\n\n#############################################################################\n## Issue severity button directive\n#############################################################################\n\nIssueSeverityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->\n # Display the severity of Issue and you can edit it.\n #\n # Example:\n # tg-issue-severity-button(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.severityById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"issue/issue-severity-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_issue\") != -1\n\n render = (issue) =>\n severity = $scope.severityById[issue.severity]\n\n html = template({\n severity: severity\n severityes: $scope.severityList\n editable: isEditable()\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (severity) =>\n $.fn.popover().closeAll()\n\n issue = $model.$modelValue.clone()\n issue.severity = severity\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(issue)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n onError = ->\n $confirm.notify(\"error\")\n issue.revert()\n $model.$setViewValue(issue)\n currentLoading.finish()\n\n $repo.save(issue).then(onSuccess, onError)\n\n $el.on \"click\", \".severity-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-severity\").popover().open()\n\n $el.on \"click\", \".severity\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n severity = target.data(\"severity-id\")\n\n save(severity)\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssueSeverityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueSeverityButtonDirective])\n\n\n#############################################################################\n## Issue priority button directive\n#############################################################################\n\nIssuePriorityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->\n # Display the priority of Issue and you can edit it.\n #\n # Example:\n # tg-issue-priority-button(ng-model=\"issue\")\n #\n # Requirements:\n # - Issue object (ng-model)\n # - scope.priorityById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"issue/issue-priority-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_issue\") != -1\n\n render = (issue) =>\n priority = $scope.priorityById[issue.priority]\n\n html = template({\n priority: priority\n priorityes: $scope.priorityList\n editable: isEditable()\n })\n\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (priority) =>\n $.fn.popover().closeAll()\n\n issue = $model.$modelValue.clone()\n issue.priority = priority\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(issue)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n onError = ->\n $confirm.notify(\"error\")\n issue.revert()\n $model.$setViewValue(issue)\n currentLoading.finish()\n\n $repo.save(issue).then(onSuccess, onError)\n\n $el.on \"click\", \".priority-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-priority\").popover().open()\n\n $el.on \"click\", \".priority\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n priority = target.data(\"priority-id\")\n\n save(priority)\n\n $scope.$watch $attrs.ngModel, (issue) ->\n render(issue) if issue\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgIssuePriorityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssuePriorityButtonDirective])\n\n\n#############################################################################\n## Promote Issue to US button directive\n#############################################################################\n\nPromoteIssueToUsButtonDirective = ($rootScope, $repo, $confirm, $qqueue, $translate) ->\n link = ($scope, $el, $attrs, $model) ->\n\n save = $qqueue.bindAdd (issue, askResponse) =>\n data = {\n generated_from_issue: issue.id\n project: issue.project,\n subject: issue.subject\n description: issue.description\n tags: issue.tags\n is_blocked: issue.is_blocked\n blocked_note: issue.blocked_note\n }\n\n onSuccess = ->\n askResponse.finish()\n $confirm.notify(\"success\")\n $rootScope.$broadcast(\"promote-issue-to-us:success\")\n\n onError = ->\n askResponse.finish()\n $confirm.notify(\"error\")\n\n $repo.create(\"userstories\", data).then(onSuccess, onError)\n\n\n $el.on \"click\", \"a\", (event) ->\n event.preventDefault()\n issue = $model.$modelValue\n\n title = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.TITLE\")\n message = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.MESSAGE\")\n subtitle = issue.subject\n\n $confirm.ask(title, subtitle, message).then (response) =>\n save(issue, response)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n restrict: \"AE\"\n require: \"ngModel\"\n templateUrl: \"issue/promote-issue-to-us-button.html\"\n link: link\n }\n\nmodule.directive(\"tgPromoteIssueToUsButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgQqueue\", \"$translate\"\n PromoteIssueToUsButtonDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues/lightboxes.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaIssues\")\n\n#############################################################################\n## Issue Create Lightbox Directive\n#############################################################################\n\nCreateIssueDirective = ($repo, $confirm, $rootscope, lightboxService, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley()\n $scope.issue = {}\n\n $scope.$on \"issueform:new\", (ctx, project)->\n $el.find(\".tag-input\").val(\"\")\n\n lightboxService.open($el)\n\n $scope.issue = {\n project: project.id\n subject: \"\"\n status: project.default_issue_status\n type: project.default_issue_type\n priority: project.default_priority\n severity: project.default_severity\n tags: []\n }\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.create(\"issues\", $scope.issue)\n\n promise.then (data) ->\n currentLoading.finish()\n $rootscope.$broadcast(\"issueform:new:success\", data)\n lightboxService.close($el)\n $confirm.notify(\"success\")\n\n promise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n\n return {link:link}\n\nmodule.directive(\"tgLbCreateIssue\", [\"$tgRepo\", \"$tgConfirm\", \"$rootScope\", \"lightboxService\", \"$tgLoading\",\n CreateIssueDirective])\n\n\n#############################################################################\n## Issue Bulk Create Lightbox Directive\n#############################################################################\n\nCreateBulkIssuesDirective = ($repo, $rs, $confirm, $rootscope, $loading, lightboxService) ->\n link = ($scope, $el, attrs) ->\n $scope.$on \"issueform:bulk\", (ctx, projectId, status)->\n lightboxService.open($el)\n $scope.new = {\n projectId: projectId\n bulk: \"\"\n }\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n data = $scope.new.bulk\n projectId = $scope.new.projectId\n\n promise = $rs.issues.bulkCreate(projectId, data)\n promise.then (result) ->\n currentLoading.finish()\n $rootscope.$broadcast(\"issueform:new:success\", result)\n lightboxService.close($el)\n $confirm.notify(\"success\")\n\n promise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgLbCreateBulkIssues\", [\"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\",\n \"lightboxService\", CreateBulkIssuesDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues/list.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntrim = @.taiga.trim\ntoString = @.taiga.toString\njoinStr = @.taiga.joinStr\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\ndebounceLeading = @.taiga.debounceLeading\nstartswith = @.taiga.startswith\n\nmodule = angular.module(\"taigaIssues\")\n\n#############################################################################\n## Issues Controller\n#############################################################################\n\nclass IssuesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$tgUrls\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgEvents\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @urls, @params, @q, @location, @appMetaService,\n @navUrls, @events, @analytics, @translate) ->\n @scope.sectionName = \"Issues\"\n @scope.filters = {}\n\n if _.isEmpty(@location.search())\n filters = @rs.issues.getFilters(@params.pslug)\n filters.page = 1\n @location.search(filters)\n @location.replace()\n return\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n title = @translate.instant(\"ISSUES.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"ISSUES.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"issueform:new:success\", =>\n @analytics.trackEvent(\"issue\", \"create\", \"create issue on issues list\", 1)\n @.loadIssues()\n\n initializeSubscription: ->\n routingKey = \"changes.project.#{@scope.projectId}.issues\"\n @events.subscribe @scope, routingKey, (message) =>\n @.loadIssues()\n\n storeFilters: ->\n @rs.issues.storeFilters(@params.pslug, @location.search())\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.is_issues_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n\n @scope.issueStatusById = groupBy(project.issue_statuses, (x) -> x.id)\n @scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\")\n @scope.severityById = groupBy(project.severities, (x) -> x.id)\n @scope.severityList = _.sortBy(project.severities, \"order\")\n @scope.priorityById = groupBy(project.priorities, (x) -> x.id)\n @scope.priorityList = _.sortBy(project.priorities, \"order\")\n @scope.issueTypes = _.sortBy(project.issue_types, \"order\")\n @scope.issueTypeById = groupBy(project.issue_types, (x) -> x.id)\n\n return project\n\n getUrlFilters: ->\n filters = _.pick(@location.search(), \"page\", \"tags\", \"status\", \"types\",\n \"q\", \"severities\", \"priorities\",\n \"assignedTo\", \"createdBy\", \"orderBy\")\n\n filters.page = 1 if not filters.page\n return filters\n\n getUrlFilter: (name) ->\n filters = _.pick(@location.search(), name)\n return filters[name]\n\n loadMyFilters: ->\n return @rs.issues.getMyFilters(@scope.projectId).then (filters) =>\n return _.map filters, (value, key) =>\n return {id: key, name: key, type: \"myFilters\", selected: false}\n\n removeNotExistingFiltersFromUrl: ->\n currentSearch = @location.search()\n urlfilters = @.getUrlFilters()\n\n for filterName, filterValue of urlfilters\n if filterName == \"page\" or filterName == \"orderBy\" or filterName == \"q\"\n continue\n\n if filterName == \"tags\"\n splittedValues = _.map(\"#{filterValue}\".split(\",\"))\n else\n splittedValues = _.map(\"#{filterValue}\".split(\",\"), (x) -> if x == \"null\" then null else parseInt(x))\n\n existingValues = _.intersection(splittedValues, _.map(@scope.filters[filterName], \"id\"))\n if splittedValues.length != existingValues.length\n @location.search(filterName, existingValues.join())\n\n if currentSearch != @location.search()\n @location.replace()\n\n markSelectedFilters: (filters, urlfilters) ->\n # Build selected filters (from url) fast lookup data structure\n searchdata = {}\n for name, value of _.omit(urlfilters, \"page\", \"orderBy\")\n if not searchdata[name]?\n searchdata[name] = {}\n\n for val in \"#{value}\".split(\",\")\n searchdata[name][val] = true\n\n isSelected = (type, id) ->\n if searchdata[type]? and searchdata[type][id]\n return true\n return false\n\n for key, value of filters\n for obj in value\n obj.selected = if isSelected(obj.type, obj.id) then true else undefined\n\n loadFilters: ->\n urlfilters = @.getUrlFilters()\n\n if urlfilters.q\n @scope.filtersQ = urlfilters.q\n\n # Load My Filters\n promise = @.loadMyFilters().then (myFilters) =>\n @scope.filters.myFilters = myFilters\n return myFilters\n\n loadFilters = {}\n loadFilters.project = @scope.projectId\n loadFilters.tags = urlfilters.tags\n loadFilters.status = urlfilters.status\n loadFilters.q = urlfilters.q\n loadFilters.types = urlfilters.types\n loadFilters.severities = urlfilters.severities\n loadFilters.priorities = urlfilters.priorities\n loadFilters.assigned_to = urlfilters.assignedTo\n loadFilters.owner = urlfilters.createdBy\n\n # Load default filters data\n promise = promise.then =>\n return @rs.issues.filtersData(loadFilters)\n\n # Format filters and set them on scope\n return promise.then (data) =>\n usersFiltersFormat = (users, type, unknownOption) =>\n reformatedUsers = _.map users, (t) =>\n t.type = type\n t.name = if t.full_name then t.full_name else unknownOption\n\n return t\n\n unknownItem = _.remove(reformatedUsers, (u) -> not u.id)\n reformatedUsers = _.sortBy(reformatedUsers, (u) -> u.name.toUpperCase())\n if unknownItem.length > 0\n reformatedUsers.unshift(unknownItem[0])\n return reformatedUsers\n\n choicesFiltersFormat = (choices, type, byIdObject) =>\n _.map choices, (t) ->\n t.type = type\n return t\n\n tagsFilterFormat = (tags) =>\n return _.map tags, (t) ->\n t.id = t.name\n t.type = 'tags'\n return t\n\n # Build filters data structure\n @scope.filters.status = choicesFiltersFormat(data.statuses, \"status\", @scope.issueStatusById)\n @scope.filters.severities = choicesFiltersFormat(data.severities, \"severities\", @scope.severityById)\n @scope.filters.priorities = choicesFiltersFormat(data.priorities, \"priorities\", @scope.priorityById)\n @scope.filters.assignedTo = usersFiltersFormat(data.assigned_to, \"assignedTo\", \"Unassigned\")\n @scope.filters.createdBy = usersFiltersFormat(data.owners, \"createdBy\", \"Unknown\")\n @scope.filters.types = choicesFiltersFormat(data.types, \"types\", @scope.issueTypeById)\n @scope.filters.tags = tagsFilterFormat(data.tags)\n\n @.removeNotExistingFiltersFromUrl()\n @.markSelectedFilters(@scope.filters, urlfilters)\n\n @rootscope.$broadcast(\"filters:loaded\", @scope.filters)\n\n # We need to guarantee that the last petition done here is the finally used\n # When searching by text loadIssues can be called fastly with different parameters and\n # can be resolved in a different order than generated\n # We count the requests made and only if the callback is for the last one data is updated\n loadIssuesRequests: 0\n loadIssues: =>\n @scope.urlFilters = @.getUrlFilters()\n\n # Convert stored filters to http parameters\n # ready filters (the name difference exists\n # because of some automatic lookups and is\n # the simplest way todo it without adding\n # additional complexity to code.\n @scope.httpParams = {}\n for name, values of @scope.urlFilters\n if name == \"severities\"\n name = \"severity\"\n else if name == \"orderBy\"\n name = \"order_by\"\n else if name == \"priorities\"\n name = \"priority\"\n else if name == \"assignedTo\"\n name = \"assigned_to\"\n else if name == \"createdBy\"\n name = \"owner\"\n else if name == \"status\"\n name = \"status\"\n else if name == \"types\"\n name = \"type\"\n @scope.httpParams[name] = values\n\n promise = @rs.issues.list(@scope.projectId, @scope.httpParams)\n @.loadIssuesRequests += 1\n promise.index = @.loadIssuesRequests\n promise.then (data) =>\n if promise.index == @.loadIssuesRequests\n @scope.issues = data.models\n @scope.page = data.current\n @scope.count = data.count\n @scope.paginatedBy = data.paginatedBy\n\n return data\n\n return promise\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.initializeSubscription()\n @.loadFilters()\n\n return @.loadIssues()\n\n saveCurrentFiltersTo: (newFilter) ->\n deferred = @q.defer()\n @rs.issues.getMyFilters(@scope.projectId).then (filters) =>\n filters[newFilter] = @location.search()\n @rs.issues.storeMyFilters(@scope.projectId, filters).then =>\n deferred.resolve()\n return deferred.promise\n\n deleteMyFilter: (filter) ->\n deferred = @q.defer()\n @rs.issues.getMyFilters(@scope.projectId).then (filters) =>\n delete filters[filter]\n @rs.issues.storeMyFilters(@scope.projectId, filters).then =>\n deferred.resolve()\n return deferred.promise\n\n # Functions used from templates\n addNewIssue: ->\n @rootscope.$broadcast(\"issueform:new\", @scope.project)\n\n addIssuesInBulk: ->\n @rootscope.$broadcast(\"issueform:bulk\", @scope.projectId)\n\n\nmodule.controller(\"IssuesController\", IssuesController)\n\n#############################################################################\n## Issues Directive\n#############################################################################\n\nIssuesDirective = ($log, $location, $template, $compile) ->\n ## Issues Pagination\n template = $template.get(\"issue/issue-paginator.html\", true)\n\n linkPagination = ($scope, $el, $attrs, $ctrl) ->\n # Constants\n afterCurrent = 2\n beforeCurrent = 4\n atBegin = 2\n atEnd = 2\n\n $pagEl = $el.find(\".issues-paginator\")\n\n getNumPages = ->\n numPages = $scope.count / $scope.paginatedBy\n if parseInt(numPages, 10) < numPages\n numPages = parseInt(numPages, 10) + 1\n else\n numPages = parseInt(numPages, 10)\n\n return numPages\n\n renderPagination = ->\n numPages = getNumPages()\n\n if numPages <= 1\n $pagEl.hide()\n return\n $pagEl.show()\n\n pages = []\n options = {}\n options.pages = pages\n options.showPrevious = ($scope.page > 1)\n options.showNext = not ($scope.page == numPages)\n\n cpage = $scope.page\n\n for i in [1..numPages]\n if i == (cpage + afterCurrent) and numPages > (cpage + afterCurrent + atEnd)\n pages.push({classes: \"dots\", type: \"dots\"})\n else if i == (cpage - beforeCurrent) and cpage > (atBegin + beforeCurrent)\n pages.push({classes: \"dots\", type: \"dots\"})\n else if i > (cpage + afterCurrent) and i <= (numPages - atEnd)\n else if i < (cpage - beforeCurrent) and i > atBegin\n else if i == cpage\n pages.push({classes: \"active\", num: i, type: \"page-active\"})\n else\n pages.push({classes: \"page\", num: i, type: \"page\"})\n\n\n html = template(options)\n html = $compile(html)($scope)\n\n $pagEl.html(html)\n\n $scope.$watch \"issues\", (value) ->\n # Do nothing if value is not logical true\n return if not value\n\n renderPagination()\n\n $el.on \"click\", \".issues-paginator a.next\", (event) ->\n event.preventDefault()\n\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", $scope.page + 1)\n $ctrl.loadIssues()\n\n $el.on \"click\", \".issues-paginator a.previous\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", $scope.page - 1)\n $ctrl.loadIssues()\n\n $el.on \"click\", \".issues-paginator li.page > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n pagenum = target.data(\"pagenum\")\n\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", pagenum)\n $ctrl.loadIssues()\n\n ## Issues Filters\n linkOrdering = ($scope, $el, $attrs, $ctrl) ->\n # Draw the arrow the first time\n currentOrder = $ctrl.getUrlFilter(\"orderBy\") or \"created_date\"\n if currentOrder\n icon = if startswith(currentOrder, \"-\") then \"icon-arrow-up\" else \"icon-arrow-bottom\"\n colHeadElement = $el.find(\".row.title > div[data-fieldname='#{trim(currentOrder, \"-\")}']\")\n colHeadElement.html(\"#{colHeadElement.html()}\")\n\n $el.on \"click\", \".row.title > div\", (event) ->\n target = angular.element(event.currentTarget)\n\n currentOrder = $ctrl.getUrlFilter(\"orderBy\")\n newOrder = target.data(\"fieldname\")\n\n finalOrder = if currentOrder == newOrder then \"-#{newOrder}\" else newOrder\n\n $scope.$apply ->\n $ctrl.replaceFilter(\"orderBy\", finalOrder)\n $ctrl.storeFilters()\n $ctrl.loadIssues().then ->\n # Update the arrow\n $el.find(\".row.title > div > span.icon\").remove()\n icon = if startswith(finalOrder, \"-\") then \"icon-arrow-up\" else \"icon-arrow-bottom\"\n target.html(\"#{target.html()}\")\n\n ## Issues Link\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n linkOrdering($scope, $el, $attrs, $ctrl)\n linkPagination($scope, $el, $attrs, $ctrl)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgIssues\", [\"$log\", \"$tgLocation\", \"$tgTemplate\", \"$compile\", IssuesDirective])\n\n\n#############################################################################\n## Issues Filters Directive\n#############################################################################\n\nIssuesFiltersDirective = ($q, $log, $location, $rs, $confirm, $loading, $template, $translate, $compile, $auth) ->\n template = $template.get(\"issue/issues-filters.html\", true)\n templateSelected = $template.get(\"issue/issues-filters-selected.html\", true)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.closest(\".wrapper\").controller()\n\n selectedFilters = []\n\n showFilters = (title, type) ->\n $el.find(\".filters-cats\").hide()\n $el.find(\".filter-list\").removeClass(\"hidden\")\n $el.find(\"h2.breadcrumb\").removeClass(\"hidden\")\n $el.find(\"h2 a.subfilter span.title\").html(title)\n $el.find(\"h2 a.subfilter span.title\").prop(\"data-type\", type)\n\n showCategories = ->\n $el.find(\".filters-cats\").show()\n $el.find(\".filter-list\").addClass(\"hidden\")\n $el.find(\"h2.breadcrumb\").addClass(\"hidden\")\n\n initializeSelectedFilters = (filters) ->\n selectedFilters = []\n for name, values of filters\n for val in values\n selectedFilters.push(val) if val.selected\n\n renderSelectedFilters(selectedFilters)\n\n renderSelectedFilters = (selectedFilters) ->\n _.filter selectedFilters, (f) =>\n if f.color\n f.style = \"border-left: 3px solid #{f.color}\"\n\n html = templateSelected({filters:selectedFilters})\n html = $compile(html)($scope)\n $el.find(\".filters-applied\").html(html)\n\n if $auth.isAuthenticated() && selectedFilters.length > 0\n $el.find(\".save-filters\").show()\n else\n $el.find(\".save-filters\").hide()\n\n renderFilters = (filters) ->\n _.filter filters, (f) =>\n if f.color\n f.style = \"border-left: 3px solid #{f.color}\"\n\n html = template({filters:filters})\n html = $compile(html)($scope)\n $el.find(\".filter-list\").html(html)\n\n getFiltersType = () ->\n return $el.find(\"h2 a.subfilter span.title\").prop('data-type')\n\n reloadIssues = () ->\n currentFiltersType = getFiltersType()\n\n $q.all([$ctrl.loadIssues(), $ctrl.loadFilters()]).then () ->\n filters = $scope.filters[currentFiltersType]\n renderFilters(_.reject(filters, \"selected\"))\n\n toggleFilterSelection = (type, id) ->\n if type == \"myFilters\"\n $rs.issues.getMyFilters($scope.projectId).then (data) ->\n myFilters = data\n filters = myFilters[id]\n filters.page = 1\n $ctrl.replaceAllFilters(filters)\n $ctrl.storeFilters()\n $ctrl.loadIssues()\n $ctrl.markSelectedFilters($scope.filters, filters)\n initializeSelectedFilters($scope.filters)\n return null\n\n filters = $scope.filters[type]\n filterId = if type == 'tags' then taiga.toString(id) else id\n filter = _.find(filters, {id: filterId})\n filter.selected = (not filter.selected)\n\n # Convert id to null as string for properly\n # put null value on url parameters\n id = \"null\" if id is null\n\n if filter.selected\n selectedFilters.push(filter)\n $ctrl.selectFilter(type, id)\n $ctrl.selectFilter(\"page\", 1)\n $ctrl.storeFilters()\n else\n selectedFilters = _.reject selectedFilters, (f) ->\n return f.id == filter.id && f.type == filter.type\n\n $ctrl.unselectFilter(type, id)\n $ctrl.selectFilter(\"page\", 1)\n $ctrl.storeFilters()\n\n reloadIssues()\n\n renderSelectedFilters(selectedFilters)\n\n currentFiltersType = getFiltersType()\n\n if type == currentFiltersType\n renderFilters(_.reject(filters, \"selected\"))\n\n # Angular Watchers\n $scope.$on \"filters:loaded\", (ctx, filters) ->\n initializeSelectedFilters(filters)\n\n $scope.$on \"filters:issueupdate\", (ctx, filters) ->\n html = template({filters:filters.status})\n html = $compile(html)($scope)\n $el.find(\".filter-list\").html(html)\n\n selectQFilter = debounceLeading 100, (value) ->\n return if value is undefined\n\n $ctrl.replaceFilter(\"page\", null, true)\n\n if value.length == 0\n $ctrl.replaceFilter(\"q\", null)\n $ctrl.storeFilters()\n else\n $ctrl.replaceFilter(\"q\", value)\n $ctrl.storeFilters()\n\n reloadIssues()\n\n $scope.$watch(\"filtersQ\", selectQFilter)\n\n # Dom Event Handlers\n $el.on \"click\", \".filters-cats > ul > li > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n tags = $scope.filters[target.data(\"type\")]\n renderFilters(_.reject(tags, \"selected\"))\n showFilters(target.attr(\"title\"), target.data(\"type\"))\n\n $el.on \"click\", \".filters-inner > .filters-step-cat > .breadcrumb > .back\", (event) ->\n event.preventDefault()\n showCategories($el)\n\n $el.on \"click\", \".filters-applied a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n id = target.data(\"id\") or null\n type = target.data(\"type\")\n toggleFilterSelection(type, id)\n\n $el.on \"click\", \".filter-list .single-filter\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.toggleClass(\"active\")\n\n id = target.data(\"id\") or null\n type = target.data(\"type\")\n\n # A saved filter can't be active\n if type == \"myFilters\"\n target.removeClass(\"active\")\n\n toggleFilterSelection(type, id)\n\n $el.on \"click\", \".filter-list .single-filter .icon-delete\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n\n target = angular.element(event.currentTarget)\n customFilterName = target.parent().data('id')\n title = $translate.instant(\"ISSUES.FILTERS.CONFIRM_DELETE.TITLE\")\n message = $translate.instant(\"ISSUES.FILTERS.CONFIRM_DELETE.MESSAGE\", {customFilterName: customFilterName})\n\n $confirm.askOnDelete(title, message).then (askResponse) ->\n promise = $ctrl.deleteMyFilter(customFilterName)\n promise.then ->\n promise = $ctrl.loadMyFilters()\n promise.then (filters) ->\n askResponse.finish()\n $scope.filters.myFilters = filters\n renderFilters($scope.filters.myFilters)\n promise.then null, ->\n askResponse.finish()\n promise.then null, ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n\n $el.on \"click\", \".save-filters\", (event) ->\n event.preventDefault()\n renderFilters($scope.filters[\"myFilters\"])\n showFilters(\"My filters\", \"myFilters\")\n $el.find('.save-filters').hide()\n $el.find('.my-filter-name').removeClass(\"hidden\")\n $el.find('.my-filter-name').focus()\n $scope.$apply()\n\n $el.on \"keyup\", \".my-filter-name\", (event) ->\n event.preventDefault()\n if event.keyCode == 13\n target = angular.element(event.currentTarget)\n newFilter = target.val()\n currentLoading = $loading()\n .target($el.find(\".new\"))\n .start()\n promise = $ctrl.saveCurrentFiltersTo(newFilter)\n promise.then ->\n loadPromise = $ctrl.loadMyFilters()\n loadPromise.then (filters) ->\n currentLoading.finish()\n $scope.filters.myFilters = filters\n\n currentfilterstype = $el.find(\"h2 a.subfilter span.title\").prop('data-type')\n if currentfilterstype == \"myFilters\"\n renderFilters($scope.filters.myFilters)\n\n $el.find('.my-filter-name').addClass(\"hidden\")\n $el.find('.save-filters').show()\n\n loadPromise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\", \"Error loading custom filters\")\n\n promise.then null, ->\n currentLoading.finish()\n $el.find(\".my-filter-name\").val(newFilter).focus().select()\n $confirm.notify(\"error\", \"Filter not saved\")\n\n else if event.keyCode == 27\n $el.find('.my-filter-name').val('')\n $el.find('.my-filter-name').addClass(\"hidden\")\n $el.find('.save-filters').show()\n\n return {link:link}\n\nmodule.directive(\"tgIssuesFilters\", [\"$q\", \"$log\", \"$tgLocation\", \"$tgResources\", \"$tgConfirm\", \"$tgLoading\",\n \"$tgTemplate\", \"$translate\", \"$compile\", \"$tgAuth\", IssuesFiltersDirective])\n\n\n#############################################################################\n## Issue status Directive (popover for change status)\n#############################################################################\n\nIssueStatusInlineEditionDirective = ($repo, $template, $rootscope) ->\n ###\n Print the status of an Issue and a popover to change it.\n - tg-issue-status-inline-edition: The issue\n\n Example:\n\n div.status(tg-issue-status-inline-edition=\"issue\")\n a.issue-status(href=\"\")\n\n NOTE: This directive need 'issueStatusById' and 'project'.\n ###\n selectionTemplate = $template.get(\"issue/issue-status-inline-edition-selection.html\", true)\n\n updateIssueStatus = ($el, issue, issueStatusById) ->\n issueStatusDomParent = $el.find(\".issue-status\")\n issueStatusDom = $el.find(\".issue-status .issue-status-bind\")\n\n status = issueStatusById[issue.status]\n\n if status\n issueStatusDom.text(status.name)\n issueStatusDom.prop(\"title\", status.name)\n issueStatusDomParent.css('color', status.color)\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n issue = $scope.$eval($attrs.tgIssueStatusInlineEdition)\n\n $el.on \"click\", \".issue-status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n\n for filter in $scope.filters.status\n if filter.id == issue.status\n filter.count--\n\n issue.status = target.data(\"status-id\")\n $el.find(\".pop-status\").popover().close()\n updateIssueStatus($el, issue, $scope.issueStatusById)\n\n $scope.$apply () ->\n $repo.save(issue).then ->\n $ctrl.loadIssues()\n\n for filter in $scope.filters.status\n if filter.id == issue.status\n filter.count++\n\n $rootscope.$broadcast(\"filters:issueupdate\", $scope.filters)\n\n taiga.bindOnce $scope, \"project\", (project) ->\n $el.append(selectionTemplate({ 'statuses': project.issue_statuses }))\n updateIssueStatus($el, issue, $scope.issueStatusById)\n\n # If the user has not enough permissions the click events are unbinded\n if project.my_permissions.indexOf(\"modify_issue\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n $scope.$watch $attrs.tgIssueStatusInlineEdition, (val) =>\n updateIssueStatus($el, val, $scope.issueStatusById)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgIssueStatusInlineEdition\", [\"$tgRepo\", \"$tgTemplate\", \"$rootScope\",\n IssueStatusInlineEditionDirective])\n\n\n#############################################################################\n## Issue assigned to Directive\n#############################################################################\n\nIssueAssignedToInlineEditionDirective = ($repo, $rootscope, popoverService) ->\n template = _.template(\"\"\"\n \" alt=\"<%- name %>\"/>\n
<%- name %>
\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n updateIssue = (issue) ->\n ctx = {name: \"Unassigned\", imgurl: \"/images/unnamed.png\"}\n member = $scope.usersById[issue.assigned_to]\n if member\n ctx.imgurl = member.photo\n ctx.name = member.full_name_display\n\n $el.find(\".avatar\").html(template(ctx))\n $el.find(\".issue-assignedto\").attr('title', ctx.name)\n\n $ctrl = $el.controller()\n issue = $scope.$eval($attrs.tgIssueAssignedToInlineEdition)\n updateIssue(issue)\n\n $el.on \"click\", \".issue-assignedto\", (event) ->\n $rootscope.$broadcast(\"assigned-to:add\", issue)\n\n taiga.bindOnce $scope, \"project\", (project) ->\n # If the user has not enough permissions the click events are unbinded\n if project.my_permissions.indexOf(\"modify_issue\") == -1\n $el.unbind(\"click\")\n $el.find(\"a\").addClass(\"not-clickable\")\n\n $scope.$on \"assigned-to:added\", (ctx, userId, updatedIssue) =>\n if updatedIssue.id == issue.id\n updatedIssue.assigned_to = userId\n $repo.save(updatedIssue)\n updateIssue(updatedIssue)\n\n $scope.$watch $attrs.tgIssueAssignedToInlineEdition, (val) =>\n updateIssue(val)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgIssueAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\",\n IssueAssignedToInlineEditionDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/userstories/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaUserStories\")\n\n#############################################################################\n## User story Detail Controller\n#############################################################################\n\nclass UserStoryDetailController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$log\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location,\n @log, @appMetaService, @navUrls, @analytics, @translate) ->\n bindMethods(@)\n\n @scope.usRef = @params.usref\n @scope.sectionName = @translate.instant(\"US.SECTION_NAME\")\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n @._setMeta()\n @.initializeOnDeleteGoToUrl()\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n totalTasks = @scope.tasks.length\n closedTasks = _.filter(@scope.tasks, (t) => @scope.taskStatusById[t.status].is_closed).length\n progressPercentage = if totalTasks > 0 then Math.round(100 * closedTasks / totalTasks) else 0\n\n title = @translate.instant(\"US.PAGE_TITLE\", {\n userStoryRef: \"##{@scope.us.ref}\"\n userStorySubject: @scope.us.subject\n projectName: @scope.project.name\n })\n description = @translate.instant(\"US.PAGE_DESCRIPTION\", {\n userStoryStatus: @scope.statusById[@scope.us.status]?.name or \"--\"\n userStoryPoints: @scope.us.total_points\n userStoryDescription: angular.element(@scope.us.description_html or \"\").text()\n userStoryClosedTasks: closedTasks\n userStoryTotalTasks: totalTasks\n userStoryProgressPercentage: progressPercentage\n })\n\n @appMetaService.setAll(title, description)\n\n initializeEventHandlers: ->\n @scope.$on \"related-tasks:update\", =>\n @scope.tasks = _.clone(@scope.tasks, false)\n\n @scope.$on \"attachment:create\", =>\n @analytics.trackEvent(\"attachment\", \"create\", \"create attachment on userstory\", 1)\n\n @scope.$on \"comment:new\", =>\n @.loadUs()\n\n initializeOnDeleteGoToUrl: ->\n ctx = {project: @scope.project.slug}\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project\", ctx)\n if @scope.project.is_backlog_activated\n if @scope.us.milestone\n ctx.sprint = @scope.sprint.slug\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-taskboard\", ctx)\n else\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-backlog\", ctx)\n else if @scope.project.is_kanban_activated\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-kanban\", ctx)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.statusList = project.us_statuses\n @scope.statusById = groupBy(project.us_statuses, (x) -> x.id)\n @scope.taskStatusById = groupBy(project.task_statuses, (x) -> x.id)\n @scope.pointsList = _.sortBy(project.points, \"order\")\n @scope.pointsById = groupBy(@scope.pointsList, (e) -> e.id)\n return project\n\n loadUs: ->\n httpParams = _.pick(@location.search(), \"milestone\", \"no-milestone\", \"kanban-status\")\n milestone = httpParams.milestone\n if milestone\n @rs.userstories.storeQueryParams(@scope.projectId, {\n milestone: milestone\n order_by: \"sprint_order\"\n })\n\n noMilestone = httpParams[\"no-milestone\"]\n if noMilestone\n @rs.userstories.storeQueryParams(@scope.projectId, {\n milestone: \"null\"\n order_by: \"backlog_order\"\n })\n\n kanbanStaus = httpParams[\"kanban-status\"]\n if kanbanStaus\n @rs.userstories.storeQueryParams(@scope.projectId, {\n status: kanbanStaus\n order_by: \"kanban_order\"\n })\n\n\n\n return @rs.userstories.getByRef(@scope.projectId, @params.usref).then (us) =>\n @scope.us = us\n @scope.usId = us.id\n @scope.commentModel = us\n\n if @scope.us.neighbors.previous.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.us.neighbors.previous.ref\n }\n @scope.previousUrl = @navUrls.resolve(\"project-userstories-detail\", ctx)\n\n if @scope.us.neighbors.next.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.us.neighbors.next.ref\n }\n @scope.nextUrl = @navUrls.resolve(\"project-userstories-detail\", ctx)\n\n return us\n\n loadSprint: ->\n if @scope.us.milestone\n return @rs.sprints.get(@scope.us.project, @scope.us.milestone).then (sprint) =>\n @scope.sprint = sprint\n return sprint\n\n loadTasks: ->\n return @rs.tasks.list(@scope.projectId, null, @scope.usId).then (tasks) =>\n @scope.tasks = tasks\n return tasks\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.loadUs().then(=> @q.all([@.loadSprint(), @.loadTasks()]))\n\n ###\n # Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n # See app/modules/components/vote-button for more info\n ###\n onUpvote: ->\n onSuccess = =>\n @.loadUs()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.userstories.upvote(@scope.usId).then(onSuccess, onError)\n\n onDownvote: ->\n onSuccess = =>\n @.loadUs()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.userstories.downvote(@scope.usId).then(onSuccess, onError)\n\n ###\n # Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n # See app/modules/components/watch-button for more info\n ###\n onWatch: ->\n onSuccess = =>\n @.loadUs()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.userstories.watch(@scope.usId).then(onSuccess, onError)\n\n onUnwatch: ->\n onSuccess = =>\n @.loadUs()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.userstories.unwatch(@scope.usId).then(onSuccess, onError)\n\nmodule.controller(\"UserStoryDetailController\", UserStoryDetailController)\n\n\n#############################################################################\n## User story status display directive\n#############################################################################\n\nUsStatusDisplayDirective = ($template, $compile) ->\n # Display if a US is open or closed and its kanban status.\n #\n # Example:\n # tg-us-status-display(ng-model=\"us\")\n #\n # Requirements:\n # - US object (ng-model)\n # - scope.statusById object\n\n template = $template.get(\"common/components/status-display.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (us) ->\n status = $scope.statusById[us.status]\n\n html = template({\n is_closed: us.is_closed\n status: status\n })\n\n html = $compile(html)($scope)\n $el.html(html)\n\n $scope.$watch $attrs.ngModel, (us) ->\n render(us) if us?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsStatusDisplay\", [\"$tgTemplate\", \"$compile\", UsStatusDisplayDirective])\n\n\n#############################################################################\n## User story related tasts progress splay Directive\n#############################################################################\n\nUsTasksProgressDisplayDirective = ($template, $compile) ->\n # Display a progress bar with the stats of completed tasks.\n #\n # Example:\n # tg-us-tasks-progress-display(ng-model=\"tasks\")\n #\n # Requirements:\n # - Task object list (ng-model)\n # - scope.taskStatusById object\n\n link = ($scope, $el, $attrs) ->\n render = (tasks) ->\n totalTasks = tasks.length\n totalClosedTasks = _.filter(tasks, (task) => $scope.taskStatusById[task.status].is_closed).length\n\n progress = if totalTasks > 0 then 100 * totalClosedTasks / totalTasks else 0\n\n _.assign($scope, {\n totalTasks: totalTasks\n totalClosedTasks: totalClosedTasks\n progress: progress,\n style: {\n width: progress + \"%\"\n }\n })\n\n $scope.$watch $attrs.ngModel, (tasks) ->\n render(tasks) if tasks?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n templateUrl: \"us/us-task-progress.html\"\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n scope: true\n }\n\nmodule.directive(\"tgUsTasksProgressDisplay\", [\"$tgTemplate\", \"$compile\", UsTasksProgressDisplayDirective])\n\n\n#############################################################################\n## User story status button directive\n#############################################################################\n\nUsStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template) ->\n # Display the status of a US and you can edit it.\n #\n # Example:\n # tg-us-status-button(ng-model=\"us\")\n #\n # Requirements:\n # - Us object (ng-model)\n # - scope.statusById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"us/us-status-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_us\") != -1\n\n render = (us) =>\n status = $scope.statusById[us.status]\n\n html = template({\n status: status\n statuses: $scope.statusList\n editable: isEditable()\n })\n\n $el.html(html)\n\n save = $qqueue.bindAdd (status) =>\n us = $model.$modelValue.clone()\n\n us.status = status\n\n $.fn.popover().closeAll()\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $confirm.notify(\"success\")\n $model.$setViewValue(us)\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n\n onError = ->\n $confirm.notify(\"error\")\n currentLoading.finish()\n\n $repo.save(us).then(onSuccess, onError)\n\n $el.on \"click\", \".status-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n status = target.data(\"status-id\")\n\n save(status)\n\n $scope.$watch $attrs.ngModel, (us) ->\n render(us) if us\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\",\"$tgQqueue\", \"$tgTemplate\",\n UsStatusButtonDirective])\n\n\n#############################################################################\n## User story team requirements button directive\n#############################################################################\n\nUsTeamRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) ->\n template = $template.get(\"us/us-team-requirement-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n canEdit = ->\n return $scope.project.my_permissions.indexOf(\"modify_us\") != -1\n\n render = (us) ->\n if not canEdit() and not us.team_requirement\n $el.html(\"\")\n return\n\n ctx = {\n canEdit: canEdit()\n isRequired: us.team_requirement\n }\n html = template(ctx)\n html = $compile(html)($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (team_requirement) =>\n us = $model.$modelValue.clone()\n us.team_requirement = team_requirement\n\n currentLoading = $loading()\n .target($el.find(\"label\"))\n .start()\n\n promise = $tgrepo.save(us)\n promise.then =>\n $model.$setViewValue(us)\n currentLoading.finish()\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n currentLoading.finish()\n $confirm.notify(\"error\")\n\n $el.on \"click\", \".team-requirement\", (event) ->\n return if not canEdit()\n\n team_requirement = not $model.$modelValue.team_requirement\n\n save(team_requirement)\n\n $scope.$watch $attrs.ngModel, (us) ->\n render(us) if us\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsTeamRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", UsTeamRequirementButtonDirective])\n\n#############################################################################\n## User story client requirements button directive\n#############################################################################\n\nUsClientRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) ->\n template = $template.get(\"us/us-client-requirement-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n canEdit = ->\n return $scope.project.my_permissions.indexOf(\"modify_us\") != -1\n\n render = (us) ->\n if not canEdit() and not us.client_requirement\n $el.html(\"\")\n return\n\n ctx = {\n canEdit: canEdit()\n isRequired: us.client_requirement\n }\n html = $compile(template(ctx))($scope)\n $el.html(html)\n\n save = $qqueue.bindAdd (client_requirement) =>\n us = $model.$modelValue.clone()\n us.client_requirement = client_requirement\n\n currentLoading = $loading()\n .target($el.find(\"label\"))\n .start()\n\n promise = $tgrepo.save(us)\n promise.then =>\n $model.$setViewValue(us)\n currentLoading.finish()\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n $confirm.notify(\"error\")\n\n $el.on \"click\", \".client-requirement\", (event) ->\n return if not canEdit()\n\n client_requirement = not $model.$modelValue.client_requirement\n save(client_requirement)\n\n $scope.$watch $attrs.ngModel, (us) ->\n render(us) if us\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgUsClientRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\",\n UsClientRequirementButtonDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/tasks/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaTasks\")\n\n\n#############################################################################\n## Task Detail Controller\n#############################################################################\n\nclass TaskDetailController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$log\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location,\n @log, @appMetaService, @navUrls, @analytics, @translate) ->\n bindMethods(@)\n\n @scope.taskRef = @params.taskref\n @scope.sectionName = @translate.instant(\"TASK.SECTION_NAME\")\n @.initializeEventHandlers()\n\n promise = @.loadInitialData()\n\n promise.then () =>\n @._setMeta()\n @.initializeOnDeleteGoToUrl()\n\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n title = @translate.instant(\"TASK.PAGE_TITLE\", {\n taskRef: \"##{@scope.task.ref}\"\n taskSubject: @scope.task.subject\n projectName: @scope.project.name\n })\n description = @translate.instant(\"TASK.PAGE_DESCRIPTION\", {\n taskStatus: @scope.statusById[@scope.task.status]?.name or \"--\"\n taskDescription: angular.element(@scope.task.description_html or \"\").text()\n })\n @appMetaService.setAll(title, description)\n\n initializeEventHandlers: ->\n @scope.$on \"attachment:create\", =>\n @analytics.trackEvent(\"attachment\", \"create\", \"create attachment on task\", 1)\n @scope.$on \"custom-attributes-values:edit\", =>\n @rootscope.$broadcast(\"object:updated\")\n @scope.$on \"comment:new\", =>\n @.loadTask()\n\n initializeOnDeleteGoToUrl: ->\n ctx = {project: @scope.project.slug}\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project\", ctx)\n if @scope.project.is_backlog_activated\n if @scope.task.milestone\n ctx.sprint = @scope.sprint.slug\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-taskboard\", ctx)\n else if @scope.task.us\n ctx.ref = @scope.us.ref\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-userstories-detail\", ctx)\n else if @scope.project.is_kanban_activated\n if @scope.us\n ctx.ref = @scope.us.ref\n @scope.onDeleteGoToUrl = @navUrls.resolve(\"project-userstories-detail\", ctx)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.statusList = project.task_statuses\n @scope.statusById = groupBy(project.task_statuses, (x) -> x.id)\n return project\n\n loadTask: ->\n return @rs.tasks.getByRef(@scope.projectId, @params.taskref).then (task) =>\n @scope.task = task\n @scope.taskId = task.id\n @scope.commentModel = task\n\n if @scope.task.neighbors.previous.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.task.neighbors.previous.ref\n }\n @scope.previousUrl = @navUrls.resolve(\"project-tasks-detail\", ctx)\n\n if @scope.task.neighbors.next.ref?\n ctx = {\n project: @scope.project.slug\n ref: @scope.task.neighbors.next.ref\n }\n @scope.nextUrl = @navUrls.resolve(\"project-tasks-detail\", ctx)\n return task\n\n loadSprint: ->\n if @scope.task.milestone\n return @rs.sprints.get(@scope.task.project, @scope.task.milestone).then (sprint) =>\n @scope.sprint = sprint\n return sprint\n\n loadUserStory: ->\n if @scope.task.user_story\n return @rs.userstories.get(@scope.task.project, @scope.task.user_story).then (us) =>\n @scope.us = us\n return us\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.loadTask().then(=> @q.all([@.loadSprint(), @.loadUserStory()]))\n\n ###\n # Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n # See app/modules/components/vote-button for more info\n ###\n onUpvote: ->\n onSuccess = =>\n @.loadTask()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.tasks.upvote(@scope.taskId).then(onSuccess, onError)\n\n onDownvote: ->\n onSuccess = =>\n @.loadTask()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.tasks.downvote(@scope.taskId).then(onSuccess, onError)\n\n ###\n # Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n # See app/modules/components/watch-button for more info\n ###\n onWatch: ->\n onSuccess = =>\n @.loadTask()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.tasks.watch(@scope.taskId).then(onSuccess, onError)\n\n onUnwatch: ->\n onSuccess = =>\n @.loadTask()\n @rootscope.$broadcast(\"object:updated\")\n onError = =>\n @confirm.notify(\"error\")\n\n return @rs.tasks.unwatch(@scope.taskId).then(onSuccess, onError)\n\nmodule.controller(\"TaskDetailController\", TaskDetailController)\n\n\n#############################################################################\n## Task status display directive\n#############################################################################\n\nTaskStatusDisplayDirective = ($template, $compile) ->\n # Display if a Task is open or closed and its taskboard status.\n #\n # Example:\n # tg-task-status-display(ng-model=\"task\")\n #\n # Requirements:\n # - Task object (ng-model)\n # - scope.statusById object\n\n template = $template.get(\"common/components/status-display.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (task) ->\n status = $scope.statusById[task.status]\n\n html = template({\n is_closed: status.is_closed\n status: status\n })\n\n html = $compile(html)($scope)\n $el.html(html)\n\n $scope.$watch $attrs.ngModel, (task) ->\n render(task) if task?\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgTaskStatusDisplay\", [\"$tgTemplate\", \"$compile\", TaskStatusDisplayDirective])\n\n\n#############################################################################\n## Task status button directive\n#############################################################################\n\nTaskStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $compile, $translate, $template) ->\n # Display the status of Task and you can edit it.\n #\n # Example:\n # tg-task-status-button(ng-model=\"task\")\n #\n # Requirements:\n # - Task object (ng-model)\n # - scope.statusById object\n # - $scope.project.my_permissions\n\n template = $template.get(\"us/us-status-button.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_task\") != -1\n\n render = (task) =>\n status = $scope.statusById[task.status]\n\n html = $compile(template({\n status: status\n statuses: $scope.statusList\n editable: isEditable()\n }))($scope)\n\n $el.html(html)\n\n save = $qqueue.bindAdd (status) =>\n task = $model.$modelValue.clone()\n task.status = status\n\n currentLoading = $loading()\n .target($el.find(\".level-name\"))\n .start()\n\n onSuccess = ->\n $model.$setViewValue(task)\n $confirm.notify(\"success\")\n $rootScope.$broadcast(\"object:updated\")\n currentLoading.finish()\n\n onError = ->\n $confirm.notify(\"error\")\n currentLoading.finish()\n\n $repo.save(task).then(onSuccess, onError)\n\n $el.on \"click\", \".status-data\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n $el.find(\".pop-status\").popover().open()\n\n $el.on \"click\", \".status\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n return if not isEditable()\n\n target = angular.element(event.currentTarget)\n\n $.fn.popover().closeAll()\n\n save(target.data(\"status-id\"))\n\n $scope.$watch $attrs.ngModel, (task) ->\n render(task) if task\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgTaskStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\",\n \"$compile\", \"$translate\", \"$tgTemplate\", TaskStatusButtonDirective])\n\n\nTaskIsIocaineButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $compile) ->\n template = _.template(\"\"\"\n
\n \n \n
\n \"\"\")\n\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_task\") != -1\n\n render = (task) ->\n if not isEditable() and not task.is_iocaine\n $el.html(\"\")\n return\n\n ctx = {\n isIocaine: task.is_iocaine\n isEditable: isEditable()\n }\n html = $compile(template(ctx))($scope)\n $el.html(html)\n\n save = $qqueue.bindAdd (is_iocaine) =>\n task = $model.$modelValue.clone()\n task.is_iocaine = is_iocaine\n\n currentLoading = $loading()\n .target($el.find('label'))\n .start()\n\n promise = $tgrepo.save(task)\n\n promise.then ->\n $model.$setViewValue(task)\n $confirm.notify(\"success\")\n $rootscope.$broadcast(\"object:updated\")\n\n promise.then null, ->\n $confirm.notify(\"error\")\n\n promise.finally ->\n currentLoading.finish()\n\n $el.on \"click\", \".is-iocaine\", (event) ->\n return if not isEditable()\n\n is_iocaine = not $model.$modelValue.is_iocaine\n save(is_iocaine)\n\n $scope.$watch $attrs.ngModel, (task) ->\n render(task) if task\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgTaskIsIocaineButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\",\n \"$compile\", TaskIsIocaineButtonDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/team/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\n\nmodule = angular.module(\"taigaTeam\")\n\n#############################################################################\n## Team Controller\n#############################################################################\n\nclass TeamController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$location\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$tgAuth\",\n \"$translate\",\n \"tgProjectService\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @rs, @params, @q, @location, @navUrls, @appMetaService, @auth,\n @translate, @projectService) ->\n @scope.sectionName = \"TEAM.SECTION_NAME\"\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then =>\n title = @translate.instant(\"TEAM.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @translate.instant(\"TEAM.PAGE_DESCRIPTION\", {\n projectName: @scope.project.name,\n projectDescription: @scope.project.description\n })\n @appMetaService.setAll(title, description)\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n setRole: (role) ->\n if role\n @scope.filtersRole = role\n else\n @scope.filtersRole = null\n\n loadMembers: ->\n user = @auth.getUser()\n\n # Calculate totals\n @scope.totals = {}\n for member in @scope.activeUsers\n @scope.totals[member.id] = 0\n\n # Get current user\n @scope.currentUser = _.find(@scope.activeUsers, {id: user?.id})\n\n # Get member list without current user\n @scope.memberships = _.reject(@scope.activeUsers, {id: user?.id})\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n\n @scope.issuesEnabled = project.is_issues_activated\n @scope.tasksEnabled = project.is_kanban_activated or project.is_backlog_activated\n @scope.wikiEnabled = project.is_wiki_activated\n\n return project\n\n loadMemberStats: ->\n return @rs.projects.memberStats(@scope.projectId).then (stats) =>\n totals = {}\n _.forEach @scope.totals, (total, userId) =>\n vals = _.map(stats, (memberStats, statsKey) -> memberStats[userId])\n total = _.reduce(vals, (sum, el) -> sum + el)\n @scope.totals[userId] = total\n\n @scope.stats = @._processStats(stats)\n @scope.stats.totals = @scope.totals\n\n _processStat: (stat) ->\n max = _.max(stat)\n min = _.min(stat)\n singleStat = _.map stat, (value, key) ->\n if value == min\n return [key, 0.1]\n if value == max\n return [key, 1]\n return [key, (value * 0.5) / max]\n singleStat = _.object(singleStat)\n return singleStat\n\n _processStats: (stats) ->\n for key,value of stats\n stats[key] = @._processStat(value)\n return stats\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @.loadMembers()\n return @.loadMemberStats()\n\nmodule.controller(\"TeamController\", TeamController)\n\n\n#############################################################################\n## Team Filters Directive\n#############################################################################\n\nTeamFiltersDirective = () ->\n return {\n templateUrl: \"team/team-filter.html\"\n }\n\nmodule.directive(\"tgTeamFilters\", [TeamFiltersDirective])\n\n\n#############################################################################\n## Team Member Stats Directive\n#############################################################################\n\nTeamMemberStatsDirective = () ->\n return {\n templateUrl: \"team/team-member-stats.html\",\n scope: {\n stats: \"=\",\n userId: \"=user\"\n issuesEnabled: \"=issuesenabled\"\n tasksEnabled: \"=tasksenabled\"\n wikiEnabled: \"=wikienabled\"\n }\n }\n\nmodule.directive(\"tgTeamMemberStats\", TeamMemberStatsDirective)\n\n\n#############################################################################\n## Team Current User Directive\n#############################################################################\n\nTeamMemberCurrentUserDirective = () ->\n return {\n templateUrl: \"team/team-member-current-user.html\"\n scope: {\n projectId: \"=projectid\",\n currentUser: \"=currentuser\",\n stats: \"=\"\n issuesEnabled: \"=issuesenabled\"\n tasksEnabled: \"=tasksenabled\"\n wikiEnabled: \"=wikienabled\"\n }\n }\n\nmodule.directive(\"tgTeamCurrentUser\", TeamMemberCurrentUserDirective)\n\n\n#############################################################################\n## Team Members Directive\n#############################################################################\n\nTeamMembersDirective = () ->\n template = \"team/team-members.html\"\n\n return {\n templateUrl: template\n scope: {\n memberships: \"=\",\n filtersQ: \"=filtersq\",\n filtersRole: \"=filtersrole\",\n stats: \"=\"\n issuesEnabled: \"=issuesenabled\"\n tasksEnabled: \"=tasksenabled\"\n wikiEnabled: \"=wikienabled\"\n }\n }\n\nmodule.directive(\"tgTeamMembers\", TeamMembersDirective)\n\n\n#############################################################################\n## Leave project Directive\n#############################################################################\n\nLeaveProjectDirective = ($repo, $confirm, $location, $rs, $navurls, $translate) ->\n link = ($scope, $el, $attrs) ->\n $scope.leave = () ->\n leave_project_text = $translate.instant(\"TEAM.ACTION_LEAVE_PROJECT\")\n confirm_leave_project_text = $translate.instant(\"TEAM.CONFIRM_LEAVE_PROJECT\")\n\n $confirm.ask(leave_project_text, confirm_leave_project_text).then (response) =>\n promise = $rs.projects.leave($attrs.projectid)\n\n promise.then =>\n response.finish()\n $confirm.notify(\"success\")\n $location.path($navurls.resolve(\"home\"))\n\n promise.then null, (response) ->\n response.finish()\n $confirm.notify('error', response.data._error_message)\n\n return {\n scope: {},\n templateUrl: \"team/leave-project.html\",\n link: link\n }\n\nmodule.directive(\"tgLeaveProject\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgResources\", \"$tgNavUrls\", \"$translate\",\n LeaveProjectDirective])\n\n\n#############################################################################\n## Team Filters\n#############################################################################\n\nmembersFilter = ->\n return (members, filtersQ, filtersRole) ->\n return _.filter members, (m) -> (not filtersRole or m.role == filtersRole.id) and\n (not filtersQ or m.full_name.search(new RegExp(filtersQ, \"i\")) >= 0)\n\nmodule.filter('membersFilter', membersFilter)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/wiki/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaWiki\")\n\n#############################################################################\n## Wiki Detail Controller\n#############################################################################\n\nclass WikiDetailController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgModel\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$filter\",\n \"$log\",\n \"tgAppMetaService\",\n \"$tgNavUrls\",\n \"$tgAnalytics\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @model, @confirm, @rs, @params, @q, @location,\n @filter, @log, @appMetaService, @navUrls, @analytics, @translate) ->\n @scope.projectSlug = @params.pslug\n @scope.wikiSlug = @params.slug\n @scope.wikiTitle = @scope.wikiSlug\n @scope.sectionName = \"Wiki\"\n\n promise = @.loadInitialData()\n\n # On Success\n promise.then () => @._setMeta()\n\n # On Error\n promise.then null, @.onInitialDataError.bind(@)\n\n _setMeta: ->\n title = @translate.instant(\"WIKI.PAGE_TITLE\", {\n wikiPageName: @scope.wikiTitle\n projectName: @scope.project.name\n })\n description = @translate.instant(\"WIKI.PAGE_DESCRIPTION\", {\n wikiPageContent: angular.element(@scope.wiki.html or \"\").text()\n totalEditions: @scope.wiki.editions or 0\n lastModifiedDate: moment(@scope.wiki.modified_date).format(@translate.instant(\"WIKI.DATETIME\"))\n })\n @appMetaService.setAll(title, description)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.is_wiki_activated\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadWiki: ->\n promise = @rs.wiki.getBySlug(@scope.projectId, @params.slug)\n promise.then (wiki) =>\n @scope.wiki = wiki\n @scope.wikiId = wiki.id\n return @scope.wiki\n\n promise.then null, (xhr) =>\n @scope.wikiId = null\n\n if @scope.project.my_permissions.indexOf(\"add_wiki_page\") == -1\n return null\n\n data = {\n project: @scope.projectId\n slug: @scope.wikiSlug\n content: \"\"\n }\n @scope.wiki = @model.make_model(\"wiki\", data)\n return @scope.wiki\n\n loadWikiLinks: ->\n return @rs.wiki.listLinks(@scope.projectId).then (wikiLinks) =>\n @scope.wikiLinks = wikiLinks\n selectedWikiLink = _.find(wikiLinks, {href: @scope.wikiSlug})\n @scope.wikiTitle = selectedWikiLink.title if selectedWikiLink?\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise.then (project) =>\n @.fillUsersAndRoles(project.members, project.roles)\n @q.all([@.loadWikiLinks(), @.loadWiki()]).then () =>\n\n\n delete: ->\n title = @translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\")\n message = @scope.wikiTitle\n\n @confirm.askOnDelete(title, message).then (askResponse) =>\n onSuccess = =>\n askResponse.finish()\n ctx = {project: @scope.projectSlug}\n @location.path(@navUrls.resolve(\"project-wiki\", ctx))\n @confirm.notify(\"success\")\n\n onError = =>\n askResponse.finish(false)\n @confirm.notify(\"error\")\n\n @repo.remove(@scope.wiki).then onSuccess, onError\n\nmodule.controller(\"WikiDetailController\", WikiDetailController)\n\n\n#############################################################################\n## Wiki Summary Directive\n#############################################################################\n\nWikiSummaryDirective = ($log, $template, $compile, $translate) ->\n template = $template.get(\"wiki/wiki-summary.html\", true)\n\n link = ($scope, $el, $attrs, $model) ->\n render = (wiki) ->\n if not $scope.usersById?\n $log.error \"WikiSummaryDirective requires userById set in scope.\"\n else\n user = $scope.usersById[wiki.last_modifier]\n\n if user is undefined\n user = {name: \"unknown\", imgUrl: \"/images/user-noimage.png\"}\n else\n user = {name: user.full_name_display, imgUrl: user.photo}\n\n ctx = {\n totalEditions: wiki.editions\n lastModifiedDate: moment(wiki.modified_date).format($translate.instant(\"WIKI.DATETIME\"))\n user: user\n }\n html = template(ctx)\n html = $compile(html)($scope)\n $el.html(html)\n\n $scope.$watch $attrs.ngModel, (wikiPage) ->\n return if not wikiPage\n render(wikiPage)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgWikiSummary\", [\"$log\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiSummaryDirective])\n\n\n#############################################################################\n## Editable Wiki Content Directive\n#############################################################################\n\nEditableWikiContentDirective = ($window, $document, $repo, $confirm, $loading, $analytics, $qqueue) ->\n link = ($scope, $el, $attrs, $model) ->\n isEditable = ->\n return $scope.project.my_permissions.indexOf(\"modify_wiki_page\") != -1\n\n switchToEditMode = ->\n $el.find('.edit-wiki-content').show()\n $el.find('.view-wiki-content').hide()\n $el.find('textarea').focus()\n\n switchToReadMode = ->\n $el.find('.edit-wiki-content').hide()\n $el.find('.view-wiki-content').show()\n\n disableEdition = ->\n $el.find(\".view-wiki-content .edit\").remove()\n $el.find(\".edit-wiki-content\").remove()\n\n cancelEdition = ->\n return if not $model.$modelValue.id\n\n $scope.$apply () =>\n $model.$modelValue.revert()\n switchToReadMode()\n\n getSelectedText = ->\n if $window.getSelection\n return $window.getSelection().toString()\n else if $document.selection\n return $document.selection.createRange().text\n return null\n\n save = $qqueue.bindAdd (wiki) ->\n onSuccess = (wikiPage) ->\n if not wiki.id?\n $analytics.trackEvent(\"wikipage\", \"create\", \"create wiki page\", 1)\n\n $model.$setViewValue wikiPage.clone()\n\n $confirm.notify(\"success\")\n switchToReadMode()\n\n onError = ->\n $confirm.notify(\"error\")\n\n currentLoading = $loading()\n .removeClasses(\"icon-floppy\")\n .target($el.find('.icon-floppy'))\n .start()\n\n if wiki.id?\n promise = $repo.save(wiki).then(onSuccess, onError)\n else\n promise = $repo.create(\"wiki\", wiki).then(onSuccess, onError)\n\n promise.finally ->\n currentLoading.finish()\n\n $el.on \"click\", \"a\", (event) ->\n target = angular.element(event.target)\n href = target.attr('href')\n if href.indexOf(\"#\") == 0\n event.preventDefault()\n $('body').scrollTop($(href).offset().top)\n\n $el.on \"mousedown\", \".view-wiki-content\", (event) ->\n target = angular.element(event.target)\n return if not isEditable()\n return if event.button == 2\n\n $el.on \"mouseup\", \".view-wiki-content\", (event) ->\n target = angular.element(event.target)\n return if getSelectedText()\n return if not isEditable()\n return if target.is('a')\n return if target.is('pre')\n\n switchToEditMode()\n\n $el.on \"click\", \".save\", debounce 2000, ->\n save($scope.wiki)\n\n $el.on \"click\", \".cancel\", ->\n cancelEdition()\n\n $el.on \"keydown\", \"textarea\", (event) ->\n if event.keyCode == 27\n cancelEdition()\n\n $scope.$watch $attrs.ngModel, (wikiPage) ->\n return if not wikiPage\n\n if isEditable()\n $el.addClass('editable')\n if not wikiPage.id? or $.trim(wikiPage.content).length == 0\n switchToEditMode()\n else\n disableEdition()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n templateUrl: \"wiki/editable-wiki-content.html\"\n }\n\nmodule.directive(\"tgEditableWikiContent\", [\"$window\", \"$document\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\",\n \"$tgAnalytics\", \"$tgQqueue\", EditableWikiContentDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/wiki/detail.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaWiki\")\n\n\n#############################################################################\n## Wiki Main Directive\n#############################################################################\n\nWikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $loading, $template, $compile, $translate) ->\n template = $template.get(\"wiki/wiki-nav.html\", true)\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n if not $attrs.ngModel?\n return $log.error \"WikiNavDirective: no ng-model attr is defined\"\n\n render = (wikiLinks) ->\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1\n deleteWikiLinkPermission = $scope.project.my_permissions.indexOf(\"delete_wiki_link\") > -1\n\n html = template({\n wikiLinks: wikiLinks,\n projectSlug: $scope.projectSlug\n addWikiLinkPermission: addWikiLinkPermission\n deleteWikiLinkPermission: deleteWikiLinkPermission\n })\n\n html = $compile(html)($scope)\n\n $el.off()\n $el.html(html)\n\n $el.on \"click\", \".wiki-link .link-title\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n linkId = target.parents('.wiki-link').data('id')\n linkSlug = $scope.wikiLinks[linkId].href\n $scope.$apply ->\n ctx = {\n project: $scope.projectSlug\n slug: linkSlug\n }\n $location.path($navUrls.resolve(\"project-wiki-page\", ctx))\n\n $el.on \"click\", \".add-button\", (event) ->\n event.preventDefault()\n $el.find(\".new\").removeClass(\"hidden\")\n $el.find(\".new input\").focus()\n $el.find(\".add-button\").hide()\n\n $el.on \"click\", \".wiki-link .icon-delete\", (event) ->\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n linkId = target.parents('.wiki-link').data('id')\n\n title = $translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\")\n message = $scope.wikiLinks[linkId].title\n\n $confirm.askOnDelete(title, message).then (askResponse) =>\n promise = $tgrepo.remove($scope.wikiLinks[linkId])\n promise.then ->\n promise = $ctrl.loadWikiLinks()\n promise.then ->\n askResponse.finish()\n render($scope.wikiLinks)\n promise.then null, ->\n askResponse.finish()\n promise.then null, ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n $el.on \"keyup\", \".new input\", (event) ->\n event.preventDefault()\n if event.keyCode == 13\n target = angular.element(event.currentTarget)\n newLink = target.val()\n\n currentLoading = $loading()\n .target($el.find(\".new\"))\n .start()\n\n promise = $tgrepo.create(\"wiki-links\", {project: $scope.projectId, title: newLink})\n promise.then ->\n $analytics.trackEvent(\"wikilink\", \"create\", \"create wiki link\", 1)\n loadPromise = $ctrl.loadWikiLinks()\n loadPromise.then ->\n currentLoading.finish()\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new input\").val('')\n $el.find(\".add-button\").show()\n render($scope.wikiLinks)\n loadPromise.then null, ->\n currentLoading.finish()\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new input\").val('')\n $el.find(\".add-button\").show()\n $confirm.notify(\"error\", \"Error loading wiki links\")\n\n promise.then null, (error) ->\n currentLoading.finish()\n $el.find(\".new input\").val(newLink)\n $el.find(\".new input\").focus().select()\n if error?.__all__?[0]?\n $confirm.notify(\"error\", \"The link already exists\")\n else\n $confirm.notify(\"error\")\n\n else if event.keyCode == 27\n target = angular.element(event.currentTarget)\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new input\").val('')\n $el.find(\".add-button\").show()\n\n\n bindOnce($scope, $attrs.ngModel, render)\n\n return {link:link}\n\nmodule.directive(\"tgWikiNav\", [\"$tgRepo\", \"$log\", \"$tgLocation\", \"$tgConfirm\", \"$tgNavUrls\",\n \"$tgAnalytics\", \"$tgLoading\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiNavDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/lightboxes.coffee\n###\n\ntaiga = @.taiga\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaKanban\")\n\nMAX_MEMBERSHIP_FIELDSETS = 4\n\n#############################################################################\n## Create Members Lightbox Directive\n#############################################################################\n\nCreateMembersDirective = ($rs, $rootScope, $confirm, $loading, lightboxService, $compile) ->\n extraTextTemplate = \"\"\"\n
\n \n
\n \"\"\"\n\n template = _.template(\"\"\"\n
\n
\n data-required=\"true\" <% } %> data-type=\"email\" />\n
\n
\n \n \n
\n
\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n createFieldSet = (required = true)->\n ctx = {roleList: $scope.project.roles, required: required}\n return $compile(template(ctx))($scope)\n\n resetForm = ->\n $el.find(\"form textarea\").remove()\n $el.find(\"form .add-member-wrapper\").remove()\n\n invitations = $el.find(\".add-member-forms\")\n invitations.html($compile(extraTextTemplate)($scope))\n\n fieldSet = createFieldSet()\n invitations.prepend(fieldSet)\n\n $scope.$on \"membersform:new\", ->\n resetForm()\n lightboxService.open($el)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $el.on \"click\", \".delete-fieldset\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n fieldSet = target.closest('.add-member-wrapper')\n\n fieldSet.remove()\n\n lastActionButton = $el.find(\".add-member-wrapper fieldset:last > a\")\n if lastActionButton.hasClass(\"icon-delete delete-fieldset\")\n lastActionButton.removeClass(\"icon-delete delete-fieldset\")\n .addClass(\"icon-plus add-fieldset\")\n\n $el.on \"click\", \".add-fieldset\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n fieldSet = target.closest('.add-member-wrapper')\n\n target.removeClass(\"icon-plus add-fieldset\")\n .addClass(\"icon-delete delete-fieldset\")\n\n newFieldSet = createFieldSet(false)\n fieldSet.after(newFieldSet)\n\n $scope.$digest() # To compile newFieldSet and translate text\n\n if $el.find(\".add-member-wrapper\").length == MAX_MEMBERSHIP_FIELDSETS\n $el.find(\".add-member-wrapper fieldset:last > a\").removeClass(\"icon-plus add-fieldset\")\n .addClass(\"icon-delete delete-fieldset\")\n\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n onSuccess = (data) ->\n currentLoading.finish()\n lightboxService.close($el)\n $confirm.notify(\"success\")\n $rootScope.$broadcast(\"membersform:new:success\")\n\n onError = (data) ->\n currentLoading.finish()\n lightboxService.close($el)\n $confirm.notify(\"error\")\n $rootScope.$broadcast(\"membersform:new:error\")\n\n form = $el.find(\"form\").checksley()\n\n #checksley find new fields\n form.destroy()\n form.initialize()\n if not form.validate()\n return\n\n memberWrappers = $el.find(\"form .add-member-wrapper\")\n memberWrappers = _.filter memberWrappers, (mw) ->\n angular.element(mw).find(\"input\").hasClass('checksley-ok')\n\n invitations = _.map memberWrappers, (mw) ->\n memberWrapper = angular.element(mw)\n email = memberWrapper.find(\"input\")\n role = memberWrapper.find(\"select\")\n\n return {\n email: email.val()\n role_id: role.val()\n }\n\n if invitations.length\n invitation_extra_text = $el.find(\"form textarea\").val()\n\n promise = $rs.memberships.bulkCreateMemberships($scope.project.id,\n invitations, invitation_extra_text)\n promise.then(onSuccess, onError)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link: link}\n\nmodule.directive(\"tgLbCreateMembers\", [\"$tgResources\", \"$rootScope\", \"$tgConfirm\", \"$tgLoading\",\n \"lightboxService\", \"$compile\", CreateMembersDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/memberships.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaAdmin\")\n\n\n#############################################################################\n## Project Memberships Controller\n#############################################################################\n\nclass MembershipsController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"$tgAnalytics\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @analytics,\n @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.project = {}\n @scope.filters = {}\n\n promise = @.loadInitialData()\n\n promise.then =>\n title = @translate.instant(\"ADMIN.MEMBERSHIPS.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"membersform:new:success\", =>\n @.loadMembers()\n @analytics.trackEvent(\"membership\", \"create\", \"create memberships on admin\", 1)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadMembers: ->\n httpFilters = @.getUrlFilters()\n return @rs.memberships.list(@scope.projectId, httpFilters).then (data) =>\n @scope.memberships = _.filter(data.models, (membership) ->\n membership.user == null or membership.is_user_active)\n\n @scope.page = data.current\n @scope.count = data.count\n @scope.paginatedBy = data.paginatedBy\n return data\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then =>\n @.loadMembers()\n\n return promise\n\n getUrlFilters: ->\n filters = _.pick(@location.search(), \"page\")\n filters.page = 1 if not filters.page\n return filters\n\n addNewMembers: ->\n @rootscope.$broadcast(\"membersform:new\")\n\n\nmodule.controller(\"MembershipsController\", MembershipsController)\n\n\n#############################################################################\n## Member Avatar Directive\n#############################################################################\n\nMembershipsDirective = ($template, $compile) ->\n template = $template.get(\"admin/admin-membership-paginator.html\", true)\n\n linkPagination = ($scope, $el, $attrs, $ctrl) ->\n # Constants\n afterCurrent = 2\n beforeCurrent = 4\n atBegin = 2\n atEnd = 2\n\n $pagEl = $el.find(\".memberships-paginator\")\n\n getNumPages = ->\n numPages = $scope.count / $scope.paginatedBy\n if parseInt(numPages, 10) < numPages\n numPages = parseInt(numPages, 10) + 1\n else\n numPages = parseInt(numPages, 10)\n\n return numPages\n\n renderPagination = ->\n numPages = getNumPages()\n\n if numPages <= 1\n $pagEl.hide()\n return\n\n pages = []\n options = {}\n options.pages = pages\n options.showPrevious = ($scope.page > 1)\n options.showNext = not ($scope.page == numPages)\n\n cpage = $scope.page\n\n for i in [1..numPages]\n if i == (cpage + afterCurrent) and numPages > (cpage + afterCurrent + atEnd)\n pages.push({classes: \"dots\", type: \"dots\"})\n else if i == (cpage - beforeCurrent) and cpage > (atBegin + beforeCurrent)\n pages.push({classes: \"dots\", type: \"dots\"})\n else if i > (cpage + afterCurrent) and i <= (numPages - atEnd)\n else if i < (cpage - beforeCurrent) and i > atBegin\n else if i == cpage\n pages.push({classes: \"active\", num: i, type: \"page-active\"})\n else\n pages.push({classes: \"page\", num: i, type: \"page\"})\n\n html = template(options)\n html = $compile(html)($scope)\n\n $pagEl.html(html)\n $pagEl.show()\n\n $scope.$watch \"memberships\", (value) ->\n # Do nothing if value is not logical true\n return if not value\n\n renderPagination()\n\n $el.on \"click\", \".memberships-paginator a.next\", (event) ->\n event.preventDefault()\n\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", $scope.page + 1)\n $ctrl.loadMembers()\n\n $el.on \"click\", \".memberships-paginator a.previous\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", $scope.page - 1)\n $ctrl.loadMembers()\n\n $el.on \"click\", \".memberships-paginator li.page > a\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n pagenum = target.data(\"pagenum\")\n\n $scope.$apply ->\n $ctrl.selectFilter(\"page\", pagenum)\n $ctrl.loadMembers()\n\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n linkPagination($scope, $el, $attrs, $ctrl)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgMemberships\", [\"$tgTemplate\", \"$compile\", MembershipsDirective])\n\n\n#############################################################################\n## Member Avatar Directive\n#############################################################################\n\nMembershipsRowAvatarDirective = ($log, $template, $translate) ->\n template = $template.get(\"admin/memberships-row-avatar.html\", true)\n\n link = ($scope, $el, $attrs) ->\n pending = $translate.instant(\"ADMIN.MEMBERSHIP.STATUS_PENDING\")\n render = (member) ->\n ctx = {\n full_name: if member.full_name then member.full_name else \"\"\n email: if member.user_email then member.user_email else member.email\n imgurl: if member.photo then member.photo else \"/images/unnamed.png\"\n pending: if !member.is_user_active then pending else \"\"\n }\n\n html = template(ctx)\n $el.html(html)\n\n if not $attrs.tgMembershipsRowAvatar?\n return $log.error \"MembershipsRowAvatarDirective: the directive need a member\"\n\n member = $scope.$eval($attrs.tgMembershipsRowAvatar)\n render(member)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgMembershipsRowAvatar\", [\"$log\", \"$tgTemplate\", '$translate', MembershipsRowAvatarDirective])\n\n\n#############################################################################\n## Member IsAdminCheckbox Directive\n#############################################################################\n\nMembershipsRowAdminCheckboxDirective = ($log, $repo, $confirm, $template, $compile) ->\n template = $template.get(\"admin/admin-memberships-row-checkbox.html\", true)\n\n link = ($scope, $el, $attrs) ->\n render = (member) ->\n ctx = {inputId: \"is-admin-#{member.id}\"}\n\n html = template(ctx)\n html = $compile(html)($scope)\n\n $el.html(html)\n\n if not $attrs.tgMembershipsRowAdminCheckbox?\n return $log.error \"MembershipsRowAdminCheckboxDirective: the directive need a member\"\n\n member = $scope.$eval($attrs.tgMembershipsRowAdminCheckbox)\n html = render(member)\n\n if member.is_owner\n $el.find(\":checkbox\").prop(\"checked\", true)\n\n $el.on \"click\", \":checkbox\", (event) =>\n onSuccess = ->\n $confirm.notify(\"success\")\n\n onError = (data) ->\n member.revert()\n $el.find(\":checkbox\").prop(\"checked\", member.is_owner)\n $confirm.notify(\"error\", data.is_owner[0])\n\n target = angular.element(event.currentTarget)\n member.is_owner = target.prop(\"checked\")\n $repo.save(member).then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgMembershipsRowAdminCheckbox\", [\"$log\", \"$tgRepo\", \"$tgConfirm\",\n \"$tgTemplate\", \"$compile\", MembershipsRowAdminCheckboxDirective])\n\n\n#############################################################################\n## Member RoleSelector Directive\n#############################################################################\n\nMembershipsRowRoleSelectorDirective = ($log, $repo, $confirm) ->\n template = _.template(\"\"\"\n \n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n render = (member) ->\n ctx = {\n roleList: $scope.project.roles,\n selectedRole: member.role\n }\n\n html = template(ctx)\n $el.html(html)\n\n if not $attrs.tgMembershipsRowRoleSelector?\n return $log.error \"MembershipsRowRoleSelectorDirective: the directive need a member\"\n\n $ctrl = $el.controller()\n member = $scope.$eval($attrs.tgMembershipsRowRoleSelector)\n html = render(member)\n\n $el.on \"change\", \"select\", (event) =>\n onSuccess = ->\n $confirm.notify(\"success\")\n\n onError = ->\n $confirm.notify(\"error\")\n\n target = angular.element(event.currentTarget)\n newRole = parseInt(target.val(), 10)\n\n if member.role != newRole\n member.role = newRole\n $repo.save(member).then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgMembershipsRowRoleSelector\", [\"$log\", \"$tgRepo\", \"$tgConfirm\",\n MembershipsRowRoleSelectorDirective])\n\n\n#############################################################################\n## Member Actions Directive\n#############################################################################\n\nMembershipsRowActionsDirective = ($log, $repo, $rs, $confirm, $compile, $translate) ->\n activedTemplate = \"\"\"\n
\n
\n \n \n \n \"\"\"\n\n pendingTemplate = \"\"\"\n \n {{'ADMIN.MEMBERSHIP.RESEND' | translate}}\n \n \n \n \n \"\"\"\n\n link = ($scope, $el, $attrs) ->\n render = (member) ->\n if member.user\n html = $compile(activedTemplate)($scope)\n else\n html = $compile(pendingTemplate)($scope)\n\n $el.html(html)\n\n if not $attrs.tgMembershipsRowActions?\n return $log.error \"MembershipsRowActionsDirective: the directive need a member\"\n\n $ctrl = $el.controller()\n member = $scope.$eval($attrs.tgMembershipsRowActions)\n render(member)\n\n $el.on \"click\", \".pending\", (event) ->\n event.preventDefault()\n onSuccess = ->\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION\", {\n email: $scope.member.email\n })\n $confirm.notify(\"success\", text)\n onError = ->\n text = $translate.instant(\"ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION\")\n $confirm.notify(\"error\", text)\n\n $rs.memberships.resendInvitation($scope.member.id).then(onSuccess, onError)\n\n $el.on \"click\", \".delete\", (event) ->\n event.preventDefault()\n\n title = $translate.instant(\"ADMIN.MEMBERSHIP.DELETE_MEMBER\")\n defaultMsg = $translate.instant(\"ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE\", {email: member.email})\n message = if member.user then member.full_name else defaultMsg\n\n $confirm.askOnDelete(title, message).then (askResponse) ->\n onSuccess = =>\n askResponse.finish()\n\n if $scope.page > 1 && ($scope.count - 1) <= $scope.paginatedBy\n $ctrl.selectFilter(\"page\", $scope.page - 1)\n\n $ctrl.loadMembers()\n\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_DELETE\")\n $confirm.notify(\"success\", null, text)\n\n onError = =>\n askResponse.finish(false)\n\n text = $translate.instant(\"ADMIN.MEMBERSHIP.ERROR_DELETE\", {message: message})\n $confirm.notify(\"error\", null, text)\n\n $repo.remove(member).then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\n\nmodule.directive(\"tgMembershipsRowActions\", [\"$log\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$compile\",\n \"$translate\", MembershipsRowActionsDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/nav.coffee\n###\n\nAdminNavigationDirective = ->\n link = ($scope, $el, $attrs) ->\n section = $attrs.tgAdminNavigation\n $el.find(\".active\").removeClass(\"active\")\n $el.find(\"#adminmenu-#{section} a\").addClass(\"active\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule = angular.module(\"taigaAdmin\")\nmodule.directive(\"tgAdminNavigation\", AdminNavigationDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/project-profile.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntrim = @.taiga.trim\ntoString = @.taiga.toString\njoinStr = @.taiga.joinStr\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaAdmin\")\n\n\n#############################################################################\n## Project Profile Controller\n#############################################################################\n\nclass ProjectProfileController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @appMetaService, @translate) ->\n @scope.project = {}\n\n promise = @.loadInitialData()\n\n promise.then =>\n sectionName = @translate.instant( @scope.sectionName)\n title = @translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName, projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"project:loaded\", =>\n sectionName = @translate.instant(@scope.sectionName)\n title = @translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName, projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.pointsList = _.sortBy(project.points, \"order\")\n @scope.usStatusList = _.sortBy(project.us_statuses, \"order\")\n @scope.taskStatusList = _.sortBy(project.task_statuses, \"order\")\n @scope.prioritiesList = _.sortBy(project.priorities, \"order\")\n @scope.severitiesList = _.sortBy(project.severities, \"order\")\n @scope.issueTypesList = _.sortBy(project.issue_types, \"order\")\n @scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\")\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise\n\n openDeleteLightbox: ->\n @rootscope.$broadcast(\"deletelightbox:new\", @scope.project)\n\nmodule.controller(\"ProjectProfileController\", ProjectProfileController)\n\n\n#############################################################################\n## Project Profile Directive\n#############################################################################\n\nProjectProfileDirective = ($repo, $confirm, $loading, $navurls, $location, projectService, currentUserService) ->\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.save($scope.project)\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n newUrl = $navurls.resolve(\"project-admin-project-profile-details\", {\n project: $scope.project.slug\n })\n $location.path(newUrl)\n\n $ctrl.loadInitialData()\n\n projectService.fetchProject()\n currentUserService.loadProjects()\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link:link}\n\nmodule.directive(\"tgProjectProfile\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgNavUrls\", \"$tgLocation\",\n \"tgProjectService\", \"tgCurrentUserService\", ProjectProfileDirective])\n\n\n#############################################################################\n## Project Default Values Directive\n#############################################################################\n\nProjectDefaultValuesDirective = ($repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.save($scope.project)\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgProjectDefaultValues\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\",\n ProjectDefaultValuesDirective])\n\n#############################################################################\n## Project Modules Directive\n#############################################################################\n\nProjectModulesDirective = ($repo, $confirm, $loading, projectService) ->\n link = ($scope, $el, $attrs) ->\n submit = =>\n form = $el.find(\"form\").checksley()\n return if not form.validate()\n\n target = angular.element(\".admin-functionalities .submit-button\")\n currentLoading = $loading()\n .target(target)\n .start()\n\n promise = $repo.save($scope.project)\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n $scope.$emit(\"project:loaded\", $scope.project)\n\n projectService.fetchProject()\n\n promise.then null, (data) ->\n currentLoading.finish()\n $confirm.notify(\"error\", data._error_message)\n\n $el.on \"submit\", \"form\", (event) ->\n event.preventDefault()\n submit()\n\n $el.on \"click\", \".admin-functionalities a.button-green\", (event) ->\n event.preventDefault()\n submit()\n\n $scope.$watch \"isVideoconferenceActivated\", (isVideoconferenceActivated) ->\n if isVideoconferenceActivated\n $el.find(\".videoconference-attributes\").removeClass(\"hidden\")\n else\n $el.find(\".videoconference-attributes\").addClass(\"hidden\")\n $scope.project.videoconferences = null\n $scope.project.videoconferences_extra_data = \"\"\n\n $scope.$watch \"project\", (project) ->\n if project.videoconferences?\n $scope.isVideoconferenceActivated = true\n else\n $scope.isVideoconferenceActivated = false\n\n return {link:link}\n\nmodule.directive(\"tgProjectModules\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgProjectService\",\n ProjectModulesDirective])\n\n\n#############################################################################\n## Project Export Directive\n#############################################################################\n\nProjectExportDirective = ($window, $rs, $confirm, $translate) ->\n link = ($scope, $el, $attrs) ->\n buttonsEl = $el.find(\".admin-project-export-buttons\")\n showButtons = -> buttonsEl.removeClass(\"hidden\")\n hideButtons = -> buttonsEl.addClass(\"hidden\")\n\n resultEl = $el.find(\".admin-project-export-result\")\n showResult = -> resultEl.removeClass(\"hidden\")\n hideResult = -> resultEl.addClass(\"hidden\")\n\n spinnerEl = $el.find(\".spin\")\n showSpinner = -> spinnerEl.removeClass(\"hidden\")\n hideSpinner = -> spinnerEl.addClass(\"hidden\")\n\n resultTitleEl = $el.find(\".result-title\")\n\n\n loading_title = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_TITLE\")\n loading_msg = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_MESSAGE\")\n dump_ready_text = -> resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.DUMP_READY\"))\n asyn_message = -> resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE\"))\n syn_message = (url) -> resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.SYNC_MESSAGE\", {\n url: url}))\n\n setLoadingTitle = -> resultTitleEl.html(loading_title)\n setAsyncTitle = -> resultTitleEl.html(loading_msg)\n setSyncTitle = -> resultTitleEl.html(dump_ready_text)\n\n resultMessageEl = $el.find(\".result-message \")\n setLoadingMessage = -> resultMessageEl.html(loading_msg)\n setAsyncMessage = -> resultMessageEl.html(asyn_message)\n setSyncMessage = (url) -> resultMessageEl.html(syn_message(url))\n\n showLoadingMode = ->\n showSpinner()\n setLoadingTitle()\n setLoadingMessage()\n hideButtons()\n showResult()\n\n showExportResultAsyncMode = ->\n hideSpinner()\n setAsyncTitle()\n setAsyncMessage()\n\n showExportResultSyncMode = (url) ->\n hideSpinner()\n setSyncTitle()\n setSyncMessage(url)\n\n showErrorMode = ->\n hideSpinner()\n hideResult()\n showButtons()\n\n $el.on \"click\", \"a.button-export\", debounce 2000, (event) =>\n event.preventDefault()\n\n onSuccess = (result) =>\n if result.status == 202 # Async mode\n showExportResultAsyncMode()\n else #result.status == 200 # Sync mode\n dumpUrl = result.data.url\n showExportResultSyncMode(dumpUrl)\n $window.open(dumpUrl, \"_blank\")\n\n onError = (result) =>\n showErrorMode()\n\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR\")\n\n if result.status == 429 # TOO MANY REQUESTS\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\")\n else if result.data?._error_message\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\", {\n message: result.data._error_message})\n\n $confirm.notify(\"error\", errorMsg)\n\n showLoadingMode()\n $rs.projects.export($scope.projectId).then(onSuccess, onError)\n\n return {link:link}\n\nmodule.directive(\"tgProjectExport\", [\"$window\", \"$tgResources\", \"$tgConfirm\", \"$translate\",\n ProjectExportDirective])\n\n\n#############################################################################\n## CSV Export Controllers\n#############################################################################\n\nclass CsvExporterController extends taiga.Controller\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgUrls\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @urls, @confirm, @rs, @translate) ->\n @rootscope.$on(\"project:loaded\", @.setCsvUuid)\n @scope.$watch \"csvUuid\", (value) =>\n if value\n @scope.csvUrl = @urls.resolveAbsolute(\"#{@.type}-csv\", value)\n else\n @scope.csvUrl = \"\"\n\n setCsvUuid: =>\n @scope.csvUuid = @scope.project[\"#{@.type}_csv_uuid\"]\n\n _generateUuid: (response=null) =>\n promise = @rs.projects[\"regenerate_#{@.type}_csv_uuid\"](@scope.projectId)\n\n promise.then (data) =>\n @scope.csvUuid = data.data?.uuid\n\n promise.then null, =>\n @confirm.notify(\"error\")\n\n promise.finally ->\n response.finish() if response\n return promise\n\n regenerateUuid: ->\n if @scope.csvUuid\n title = @translate.instant(\"ADMIN.REPORTS.REGENERATE_TITLE\")\n subtitle = @translate.instant(\"ADMIN.REPORTS.REGENERATE_SUBTITLE\")\n\n @confirm.ask(title, subtitle).then @._generateUuid\n else\n @._generateUuid()\n\n\nclass CsvExporterUserstoriesController extends CsvExporterController\n type: \"userstories\"\n\n\nclass CsvExporterTasksController extends CsvExporterController\n type: \"tasks\"\n\n\nclass CsvExporterIssuesController extends CsvExporterController\n type: \"issues\"\n\n\nmodule.controller(\"CsvExporterUserstoriesController\", CsvExporterUserstoriesController)\nmodule.controller(\"CsvExporterTasksController\", CsvExporterTasksController)\nmodule.controller(\"CsvExporterIssuesController\", CsvExporterIssuesController)\n\n\n#############################################################################\n## CSV Directive\n#############################################################################\n\nCsvUsDirective = ($translate) ->\n link = ($scope) ->\n $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_US\"\n\n return {\n controller: \"CsvExporterUserstoriesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n }\n\nmodule.directive(\"tgCsvUs\", [\"$translate\", CsvUsDirective])\n\n\nCsvTaskDirective = ($translate) ->\n link = ($scope) ->\n $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_TASK\"\n\n return {\n controller: \"CsvExporterTasksController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n }\n\nmodule.directive(\"tgCsvTask\", [\"$translate\", CsvTaskDirective])\n\n\nCsvIssueDirective = ($translate) ->\n link = ($scope) ->\n $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_ISSUE\"\n\n return {\n controller: \"CsvExporterIssuesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n }\n\nmodule.directive(\"tgCsvIssue\", [\"$translate\", CsvIssueDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/project-profile.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ntrim = @.taiga.trim\ntoString = @.taiga.toString\njoinStr = @.taiga.joinStr\ngroupBy = @.taiga.groupBy\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaAdmin\")\n\n#############################################################################\n## Project values section Controller\n#############################################################################\n\nclass ProjectValuesSectionController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @appMetaService, @translate) ->\n @scope.project = {}\n\n promise = @.loadInitialData()\n\n promise.then () =>\n sectionName = @translate.instant(@scope.sectionName)\n\n title = @translate.instant(\"ADMIN.PROJECT_VALUES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": @scope.project.name\n })\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n return promise\n\n\nmodule.controller(\"ProjectValuesSectionController\", ProjectValuesSectionController)\n\n#############################################################################\n## Project values Controller\n#############################################################################\n\nclass ProjectValuesController extends taiga.Controller\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs) ->\n @scope.$on(\"admin:project-values:move\", @.moveValue)\n @rootscope.$on(\"project:loaded\", @.loadValues)\n\n loadValues: =>\n return @rs[@scope.resource].listValues(@scope.projectId, @scope.type).then (values) =>\n @scope.values = values\n @scope.maxValueOrder = _.max(values, \"order\").order\n return values\n\n moveValue: (ctx, itemValue, itemIndex) =>\n values = @scope.values\n r = values.indexOf(itemValue)\n values.splice(r, 1)\n values.splice(itemIndex, 0, itemValue)\n _.each values, (value, index) ->\n value.order = index\n\n @repo.saveAll(values)\n\nmodule.controller(\"ProjectValuesController\", ProjectValuesController)\n\n\n#############################################################################\n## Project values directive\n#############################################################################\n\nProjectValuesDirective = ($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope) ->\n ## Drag & Drop Link\n\n linkDragAndDrop = ($scope, $el, $attrs) ->\n oldParentScope = null\n newParentScope = null\n itemEl = null\n tdom = $el.find(\".sortable\")\n\n tdom.sortable({\n handle: \".row.table-main.visualization\",\n dropOnEmpty: true\n connectWith: \".project-values-body\"\n revert: 400\n axis: \"y\"\n })\n\n tdom.on \"sortstop\", (event, ui) ->\n itemEl = ui.item\n itemValue = itemEl.scope().value\n itemIndex = itemEl.index()\n $scope.$broadcast(\"admin:project-values:move\", itemValue, itemIndex)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n ## Value Link\n\n linkValue = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n valueType = $attrs.type\n objName = $attrs.objname\n\n initializeNewValue = ->\n $scope.newValue = {\n \"name\": \"\"\n \"is_closed\": false\n \"is_archived\": false\n }\n\n initializeTextTranslations = ->\n $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_#{objName.toUpperCase()}.ACTION_ADD\")\n\n initializeNewValue()\n initializeTextTranslations()\n\n $rootscope.$on \"$translateChangeEnd\", ->\n $scope.$evalAsync(initializeTextTranslations)\n\n goToBottomList = (focus = false) =>\n table = $el.find(\".table-main\")\n\n $(document.body).scrollTop(table.offset().top + table.height())\n\n if focus\n $el.find(\".new-value input:visible\").first().focus()\n\n saveValue = (target) ->\n formEl = target.parents(\"form\")\n form = formEl.checksley()\n return if not form.validate()\n\n value = formEl.scope().value\n promise = $repo.save(value)\n promise.then =>\n row = target.parents(\".row.table-main\")\n row.addClass(\"hidden\")\n row.siblings(\".visualization\").removeClass('hidden')\n\n promise.then null, (data) ->\n form.setErrors(data)\n\n saveNewValue = (target) ->\n formEl = target.parents(\"form\")\n form = formEl.checksley()\n return if not form.validate()\n\n $scope.newValue.project = $scope.project.id\n\n $scope.newValue.order = if $scope.maxValueOrder then $scope.maxValueOrder + 1 else 1\n\n promise = $repo.create(valueType, $scope.newValue)\n promise.then (data) =>\n target.addClass(\"hidden\")\n\n $scope.values.push(data)\n $scope.maxValueOrder = data.order\n initializeNewValue()\n\n promise.then null, (data) ->\n form.setErrors(data)\n\n cancel = (target) ->\n row = target.parents(\".row.table-main\")\n formEl = target.parents(\"form\")\n value = formEl.scope().value\n $scope.$apply ->\n row.addClass(\"hidden\")\n value.revert()\n row.siblings(\".visualization\").removeClass('hidden')\n\n $el.on \"click\", \".show-add-new\", (event) ->\n event.preventDefault()\n $el.find(\".new-value\").removeClass('hidden')\n\n goToBottomList(true)\n\n $el.on \"click\", \".add-new\", debounce 2000, (event) ->\n event.preventDefault()\n target = $el.find(\".new-value\")\n saveNewValue(target)\n\n $el.on \"click\", \".delete-new\", (event) ->\n event.preventDefault()\n $el.find(\".new-value\").addClass(\"hidden\")\n initializeNewValue()\n\n $el.on \"click\", \".edit-value\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n\n row = target.parents(\".row.table-main\")\n row.addClass(\"hidden\")\n\n editionRow = row.siblings(\".edition\")\n editionRow.removeClass('hidden')\n editionRow.find('input:visible').first().focus().select()\n\n $el.on \"keyup\", \".edition input\", (event) ->\n if event.keyCode == 13\n target = angular.element(event.currentTarget)\n saveValue(target)\n else if event.keyCode == 27\n target = angular.element(event.currentTarget)\n cancel(target)\n\n $el.on \"keyup\", \".new-value input\", (event) ->\n if event.keyCode == 13\n target = $el.find(\".new-value\")\n saveNewValue(target)\n else if event.keyCode == 27\n $el.find(\".new-value\").addClass(\"hidden\")\n initializeNewValue()\n\n $el.on \"click\", \".save\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n saveValue(target)\n\n $el.on \"click\", \".cancel\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n cancel(target)\n\n $el.on \"click\", \".delete-value\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.parents(\"form\")\n value = formEl.scope().value\n\n choices = {}\n _.each $scope.values, (option) ->\n if value.id != option.id\n choices[option.id] = option.name\n\n subtitle = value.name\n\n if _.keys(choices).length == 0\n return $confirm.error($translate.instant(\"ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL\"))\n\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE\")\n text = $translate.instant(\"ADMIN.PROJECT_VALUES.REPLACEMENT\")\n\n $confirm.askChoice(title, subtitle, choices, text).then (response) ->\n onSucces = ->\n $ctrl.loadValues().finally ->\n response.finish()\n onError = ->\n $confirm.notify(\"error\")\n $repo.remove(value, {\"moveTo\": response.selected}).then(onSucces, onError)\n\n link = ($scope, $el, $attrs) ->\n linkDragAndDrop($scope, $el, $attrs)\n linkValue($scope, $el, $attrs)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgProjectValues\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", ProjectValuesDirective])\n\n\n#############################################################################\n## Color selection directive\n#############################################################################\n\nColorSelectionDirective = () ->\n ## Color selection Link\n\n link = ($scope, $el, $attrs, $model) ->\n $ctrl = $el.controller()\n\n $scope.$watch $attrs.ngModel, (element) ->\n $scope.color = element.color\n\n $el.on \"click\", \".current-color\", (event) ->\n # Showing the color selector\n event.preventDefault()\n event.stopPropagation()\n target = angular.element(event.currentTarget)\n $el.find(\".select-color\").hide()\n target.siblings(\".select-color\").show()\n # Hide when click outside\n body = angular.element(\"body\")\n body.on \"click\", (event) =>\n if angular.element(event.target).parent(\".select-color\").length == 0\n $el.find(\".select-color\").hide()\n body.unbind(\"click\")\n\n $el.on \"click\", \".select-color .color\", (event) ->\n # Selecting one color on color selector\n event.preventDefault()\n target = angular.element(event.currentTarget)\n $scope.$apply ->\n $model.$modelValue.color = target.data(\"color\")\n $el.find(\".select-color\").hide()\n\n $el.on \"click\", \".select-color .selected-color\", (event) ->\n event.preventDefault()\n $scope.$apply ->\n $model.$modelValue.color = $scope.color\n $el.find(\".select-color\").hide()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link: link\n require:\"ngModel\"\n }\n\nmodule.directive(\"tgColorSelection\", ColorSelectionDirective)\n\n\n#############################################################################\n## Custom Attributes Controller\n#############################################################################\n\n# Custom attributes types (see taiga-back/taiga/projects/custom_attributes/choices.py)\nTEXT_TYPE = \"text\"\nMULTILINE_TYPE = \"multiline\"\nDATE_TYPE = \"date\"\n\n\nTYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n },\n {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n },\n {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }\n]\n\nclass ProjectCustomAttributesController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @rs, @params, @q, @location, @navUrls, @appMetaService,\n @translate) ->\n @scope.TYPE_CHOICES = TYPE_CHOICES\n\n @scope.project = {}\n\n @rootscope.$on \"project:loaded\", =>\n @.loadCustomAttributes()\n\n sectionName = @translate.instant(@scope.sectionName)\n title = @translate.instant(\"ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": @scope.project.name\n })\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n #########################\n # Custom Attribute\n #########################\n\n loadCustomAttributes: =>\n return @rs.customAttributes[@scope.type].list(@scope.projectId).then (customAttributes) =>\n @scope.customAttributes = customAttributes\n @scope.maxOrder = _.max(customAttributes, \"order\").order\n return customAttributes\n\n createCustomAttribute: (attrValues) =>\n return @repo.create(\"custom-attributes/#{@scope.type}\", attrValues)\n\n saveCustomAttribute: (attrModel) =>\n return @repo.save(attrModel)\n\n deleteCustomAttribute: (attrModel) =>\n return @repo.remove(attrModel)\n\n moveCustomAttributes: (attrModel, newIndex) =>\n customAttributes = @scope.customAttributes\n r = customAttributes.indexOf(attrModel)\n customAttributes.splice(r, 1)\n customAttributes.splice(newIndex, 0, attrModel)\n\n _.each customAttributes, (val, idx) ->\n val.order = idx\n\n @repo.saveAll(customAttributes)\n\n\nmodule.controller(\"ProjectCustomAttributesController\", ProjectCustomAttributesController)\n\n\n#############################################################################\n## Custom Attributes Directive\n#############################################################################\n\nProjectCustomAttributesDirective = ($log, $confirm, animationFrame, $translate) ->\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n ##################################\n # Drag & Drop\n ##################################\n sortableEl = $el.find(\".js-sortable\")\n\n sortableEl.sortable({\n handle: \".js-view-custom-field\",\n dropOnEmpty: true\n revert: 400\n axis: \"y\"\n })\n\n sortableEl.on \"sortstop\", (event, ui) ->\n itemEl = ui.item\n itemAttr = itemEl.scope().attr\n itemIndex = itemEl.index()\n $ctrl.moveCustomAttributes(itemAttr, itemIndex)\n\n ##################################\n # New custom attribute\n ##################################\n\n showCreateForm = ->\n $el.find(\".js-new-custom-field\").removeClass(\"hidden\")\n $el.find(\".js-new-custom-field input:visible\").first().focus()\n\n hideCreateForm = ->\n $el.find(\".js-new-custom-field\").addClass(\"hidden\")\n\n showAddButton = ->\n $el.find(\".js-add-custom-field-button\").removeClass(\"hidden\")\n\n hideAddButton = ->\n $el.find(\".js-add-custom-field-button\").addClass(\"hidden\")\n\n showCancelButton = ->\n $el.find(\".js-cancel-new-custom-field-button\").removeClass(\"hidden\")\n\n hideCancelButton = ->\n $el.find(\".js-cancel-new-custom-field-button\").addClass(\"hidden\")\n\n resetNewAttr = ->\n $scope.newAttr = {}\n\n create = (formEl) ->\n form = formEl.checksley()\n return if not form.validate()\n\n onSucces = =>\n $ctrl.loadCustomAttributes()\n hideCreateForm()\n resetNewAttr()\n $confirm.notify(\"success\")\n\n onError = (data) =>\n form.setErrors(data)\n\n attr = $scope.newAttr\n attr.project = $scope.projectId\n attr.order = if $scope.maxOrder then $scope.maxOrder + 1 else 1\n\n $ctrl.createCustomAttribute(attr).then(onSucces, onError)\n\n cancelCreate = ->\n hideCreateForm()\n resetNewAttr()\n\n $scope.$watch \"customAttributes\", (customAttributes) ->\n return if not customAttributes\n\n if customAttributes.length == 0\n hideCancelButton()\n hideAddButton()\n showCreateForm()\n else\n hideCreateForm()\n showAddButton()\n showCancelButton()\n\n $el.on \"click\", \".js-add-custom-field-button\", (event) ->\n event.preventDefault()\n\n showCreateForm()\n\n $el.on \"click\", \".js-create-custom-field-button\", debounce 2000, (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n create(formEl)\n\n $el.on \"click\", \".js-cancel-new-custom-field-button\", (event) ->\n event.preventDefault()\n\n cancelCreate()\n\n $el.on \"keyup\", \".js-new-custom-field input\", (event) ->\n if event.keyCode == 13 # Enter\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n create(formEl)\n else if event.keyCode == 27 # Esc\n cancelCreate()\n\n ##################################\n # Edit custom attribute\n ##################################\n\n showEditForm = (formEl) ->\n formEl.find(\".js-view-custom-field\").addClass(\"hidden\")\n formEl.find(\".js-edit-custom-field\").removeClass(\"hidden\")\n formEl.find(\".js-edit-custom-field input:visible\").first().focus().select()\n\n hideEditForm = (formEl) ->\n formEl.find(\".js-edit-custom-field\").addClass(\"hidden\")\n formEl.find(\".js-view-custom-field\").removeClass(\"hidden\")\n\n revertChangesInCustomAttribute = (formEl) ->\n $scope.$apply ->\n formEl.scope().attr.revert()\n\n update = (formEl) ->\n form = formEl.checksley()\n return if not form.validate()\n\n onSucces = =>\n $ctrl.loadCustomAttributes()\n hideEditForm(formEl)\n $confirm.notify(\"success\")\n\n onError = (data) =>\n form.setErrors(data)\n\n attr = formEl.scope().attr\n $ctrl.saveCustomAttribute(attr).then(onSucces, onError)\n\n cancelUpdate = (formEl) ->\n hideEditForm(formEl)\n revertChangesInCustomAttribute(formEl)\n\n $el.on \"click\", \".js-edit-custom-field-button\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n showEditForm(formEl)\n\n $el.on \"click\", \".js-update-custom-field-button\", debounce 2000, (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n update(formEl)\n\n $el.on \"click\", \".js-cancel-edit-custom-field-button\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n cancelUpdate(formEl)\n\n $el.on \"keyup\", \".js-edit-custom-field input\", (event) ->\n if event.keyCode == 13 # Enter\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n update(formEl)\n else if event.keyCode == 27 # Esc\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n cancelUpdate(formEl)\n\n ##################################\n # Delete custom attribute\n ##################################\n\n deleteCustomAttribute = (formEl) ->\n attr = formEl.scope().attr\n message = attr.name\n\n title = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.DELETE\")\n text = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE\")\n\n $confirm.ask(title, text, message).then (response) ->\n onSucces = ->\n $ctrl.loadCustomAttributes().finally -> response.finish()\n\n onError = ->\n $confirm.notify(\"error\", null, \"We have not been able to delete '#{message}'.\")\n\n $ctrl.deleteCustomAttribute(attr).then(onSucces, onError)\n\n $el.on \"click\", \".js-delete-custom-field-button\", debounce 2000, (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n formEl = target.closest(\"form\")\n\n deleteCustomAttribute(formEl)\n\n return {link: link}\n\nmodule.directive(\"tgProjectCustomAttributes\", [\"$log\", \"$tgConfirm\", \"animationFrame\", \"$translate\",\n ProjectCustomAttributesDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/memberships.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\nbindMethods = @.taiga.bindMethods\n\nmodule = angular.module(\"taigaAdmin\")\n\n\n#############################################################################\n## Project Roles Controller\n#############################################################################\n\nclass RolesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = \"ADMIN.MENU.PERMISSIONS\"\n @scope.project = {}\n @scope.anyComputableRole = true\n\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.ROLES.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n\n @scope.$emit('project:loaded', project)\n @scope.anyComputableRole = _.some(_.map(project.roles, (point) -> point.computable))\n\n return project\n\n loadRoles: ->\n return @rs.roles.list(@scope.projectId).then (roles) =>\n roles = roles.map (role) ->\n role.external_user = false\n\n return role\n\n public_permission = {\n \"name\": @translate.instant(\"ADMIN.ROLES.EXTERNAL_USER\"),\n \"permissions\": @scope.project.public_permissions,\n \"external_user\": true\n }\n\n roles.push(public_permission)\n\n @scope.roles = roles\n @scope.role = @scope.roles[0]\n return roles\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then(=> @.loadRoles())\n return promise\n\n setRole: (role) ->\n @scope.role = role\n @scope.$broadcast(\"role:changed\", @scope.role)\n\n delete: ->\n choices = {}\n for role in @scope.roles\n if role.id != @scope.role.id\n choices[role.id] = role.name\n\n if _.keys(choices).length == 0\n return @confirm.error(@translate.instant(\"ADMIN.ROLES.ERROR_DELETE_ALL\"))\n\n title = @translate.instant(\"ADMIN.ROLES.TITLE_DELETE_ROLE\")\n subtitle = @scope.role.name\n replacement = @translate.instant(\"ADMIN.ROLES.REPLACEMENT_ROLE\")\n warning = @translate.instant(\"ADMIN.ROLES.WARNING_DELETE_ROLE\")\n return @confirm.askChoice(title, subtitle, choices, replacement, warning).then (response) =>\n onSuccess = =>\n @.loadProject()\n @.loadRoles().finally =>\n response.finish()\n onError = =>\n @confirm.notify('error')\n\n return @repo.remove(@scope.role, {moveTo: response.selected}).then onSuccess, onError\n\n _enableComputable: =>\n onSuccess = =>\n @confirm.notify(\"success\")\n @.loadProject()\n\n onError = =>\n @confirm.notify(\"error\")\n @scope.role.revert()\n\n @repo.save(@scope.role).then onSuccess, onError\n\n _disableComputable: =>\n askOnSuccess = (response) =>\n onSuccess = =>\n response.finish()\n @confirm.notify(\"success\")\n @.loadProject()\n onError = =>\n response.finish()\n @confirm.notify(\"error\")\n @scope.role.revert()\n @repo.save(@scope.role).then onSuccess, onError\n\n askOnError = (response) =>\n @scope.role.revert()\n\n title = @translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_TITLE\")\n subtitle = @translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_SUBTITLE\", {\n roleName: @scope.role.name\n })\n message = @translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_MESSAGE\")\n return @confirm.ask(title, subtitle, message).then askOnSuccess, askOnError\n\n toggleComputable: debounce 2000, ->\n if not @scope.role.computable\n @._disableComputable()\n else\n @._enableComputable()\n\nmodule.controller(\"RolesController\", RolesController)\n\n\nEditRoleDirective = ($repo, $confirm) ->\n link = ($scope, $el, $attrs) ->\n toggleView = ->\n $el.find('.total').toggle()\n $el.find('.edit-role').toggle()\n\n submit = () ->\n $scope.role.name = $el.find(\"input\").val()\n\n promise = $repo.save($scope.role)\n\n promise.then ->\n $confirm.notify(\"success\")\n\n promise.then null, (data) ->\n $confirm.notify(\"error\")\n\n toggleView()\n\n $el.on \"click\", \"a.icon-edit\", ->\n toggleView()\n $el.find(\"input\").focus()\n $el.find(\"input\").val($scope.role.name)\n\n $el.on \"click\", \"a.save\", submit\n\n $el.on \"keyup\", \"input\", (event) ->\n if event.keyCode == 13 # Enter key\n submit()\n else if event.keyCode == 27 # ESC key\n toggleView()\n\n $scope.$on \"role:changed\", ->\n if $el.find('.edit-role').is(\":visible\")\n toggleView()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgEditRole\", [\"$tgRepo\", \"$tgConfirm\", EditRoleDirective])\n\nRolesDirective = ->\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgRoles\", RolesDirective)\n\nNewRoleDirective = ($tgrepo, $confirm) ->\n DEFAULT_PERMISSIONS = [\"view_project\", \"view_milestones\", \"view_us\", \"view_tasks\", \"view_issues\"]\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $el.on \"click\", \"a.add-button\", (event) ->\n event.preventDefault()\n $el.find(\".new\").removeClass(\"hidden\")\n $el.find(\".new\").focus()\n $el.find(\".add-button\").hide()\n\n $el.on \"keyup\", \".new\", (event) ->\n event.preventDefault()\n if event.keyCode == 13 # Enter key\n target = angular.element(event.currentTarget)\n newRole = {\n project: $scope.projectId\n name: target.val()\n permissions: DEFAULT_PERMISSIONS\n order: _.max($scope.roles, (r) -> r.order).order + 1\n computable: false\n }\n\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new\").val('')\n\n onSuccess = (role) ->\n insertPosition = $scope.roles.length - 1\n $scope.roles.splice(insertPosition, 0, role)\n $ctrl.setRole(role)\n $el.find(\".add-button\").show()\n $ctrl.loadProject()\n\n onError = ->\n $confirm.notify(\"error\")\n\n $tgrepo.create(\"roles\", newRole).then(onSuccess, onError)\n\n else if event.keyCode == 27 # ESC key\n target = angular.element(event.currentTarget)\n $el.find(\".new\").addClass(\"hidden\")\n $el.find(\".new\").val('')\n $el.find(\".add-button\").show()\n\n return {link:link}\n\nmodule.directive(\"tgNewRole\", [\"$tgRepo\", \"$tgConfirm\", NewRoleDirective])\n\n\n# Use category-config.scss styles\nRolePermissionsDirective = ($rootscope, $repo, $confirm, $compile) ->\n resumeTemplate = _.template(\"\"\"\n
\">
\n
\n
<%- category.activePermissions %>/<%- category.permissions.length %>
\n <% _.each(category.permissions, function(permission) { %>\n
active<% } %>\"\n title=\"{{ '<%- permission.name %>' | translate }}\">
\n <% }) %>\n
\n
\n \"\"\")\n\n categoryTemplate = _.template(\"\"\"\n
\">\n
\n
\n
\n
\n <% _.each(category.permissions, function(permission) { %>\n
\">\n \">\n
\n disabled=\"disabled\" <% } %>\n <% if(permission.active) { %> checked=\"checked\" <% } %>/>\n
\n \n \n
\n
\n <% }) %>\n
\n
\n
\n \"\"\")\n\n baseTemplate = _.template(\"\"\"\n
\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n $ctrl = $el.controller()\n\n generateCategoriesFromRole = (role) ->\n setActivePermissions = (permissions) ->\n return _.map(permissions, (x) -> _.extend({}, x, {active: x[\"key\"] in role.permissions}))\n\n isPermissionEditable = (permission, role, project) ->\n if role.external_user &&\n !project.is_private &&\n permission.key.indexOf(\"view_\") == 0\n return false\n else\n return true\n\n setActivePermissionsPerCategory = (category) ->\n return _.map(category, (cat) ->\n cat.permissions = cat.permissions.map (permission) ->\n permission.editable = isPermissionEditable(permission, role, $scope.project)\n\n return permission\n\n _.extend({}, cat, {\n activePermissions: _.filter(cat[\"permissions\"], \"active\").length\n })\n )\n\n categories = []\n\n milestonePermissions = [\n { key: \"view_milestones\", name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS\"}\n { key: \"add_milestone\", name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS\"}\n { key: \"modify_milestone\", name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS\"}\n { key: \"delete_milestone\", name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME\",\n permissions: setActivePermissions(milestonePermissions)\n })\n\n userStoryPermissions = [\n { key: \"view_us\", name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES\"}\n { key: \"add_us\", name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES\"}\n { key: \"modify_us\", name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES\"}\n { key: \"delete_us\", name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME\",\n permissions: setActivePermissions(userStoryPermissions)\n })\n\n taskPermissions = [\n { key: \"view_tasks\", name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS\"}\n { key: \"add_task\", name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS\"}\n { key: \"modify_task\", name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS\"}\n { key: \"delete_task\", name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME\" ,\n permissions: setActivePermissions(taskPermissions)\n })\n\n issuePermissions = [\n { key: \"view_issues\", name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES\"}\n { key: \"add_issue\", name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES\"}\n { key: \"modify_issue\", name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES\"}\n { key: \"delete_issue\", name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME\",\n permissions: setActivePermissions(issuePermissions)\n })\n\n wikiPermissions = [\n { key: \"view_wiki_pages\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES\"}\n { key: \"add_wiki_page\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES\"}\n { key: \"modify_wiki_page\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES\"}\n { key: \"delete_wiki_page\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES\"}\n { key: \"view_wiki_links\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS\"}\n { key: \"add_wiki_link\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS\"}\n { key: \"delete_wiki_link\", name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS\"}\n ]\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME\",\n permissions: setActivePermissions(wikiPermissions)\n })\n\n return setActivePermissionsPerCategory(categories)\n\n renderResume = (element, category) ->\n element.find(\".resume\").html($compile(resumeTemplate({category: category}))($scope))\n\n renderCategory = (category, index) ->\n html = categoryTemplate({category: category, index: index})\n html = angular.element(html)\n renderResume(html, category)\n return $compile(html)($scope)\n\n renderPermissions = () ->\n $el.off()\n html = baseTemplate()\n _.each generateCategoriesFromRole($scope.role), (category, index) ->\n html = angular.element(html).append(renderCategory(category, index))\n\n $el.html(html)\n $el.on \"click\", \".resume\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n target.next().toggleClass(\"open\")\n\n $el.on \"change\", \".category-item input\", (event) ->\n getActivePermissions = ->\n activePermissions = _.filter($el.find(\".category-item input\"), (t) ->\n angular.element(t).is(\":checked\")\n )\n activePermissions = _.sortBy(_.map(activePermissions, (t) ->\n permission = angular.element(t).parents(\".category-item\").data(\"id\")\n ))\n\n if activePermissions.length\n activePermissions.push(\"view_project\")\n\n return activePermissions\n\n target = angular.element(event.currentTarget)\n\n $scope.role.permissions = getActivePermissions()\n\n onSuccess = () ->\n categories = generateCategoriesFromRole($scope.role)\n categoryId = target.parents(\".category-config\").data(\"id\")\n renderResume(target.parents(\".category-config\"), categories[categoryId])\n $rootscope.$broadcast(\"projects:reload\")\n $confirm.notify(\"success\")\n $ctrl.loadProject()\n\n onError = ->\n $confirm.notify(\"error\")\n target.prop \"checked\", !target.prop(\"checked\")\n $scope.role.permissions = getActivePermissions()\n\n if $scope.role.external_user\n $scope.project.public_permissions = $scope.role.permissions\n $scope.project.anon_permissions = $scope.role.permissions.filter (permission) ->\n return permission.indexOf(\"view_\") == 0\n\n $repo.save($scope.project).then onSuccess, onError\n else\n $repo.save($scope.role).then onSuccess, onError\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n $scope.$on \"role:changed\", ->\n renderPermissions()\n\n bindOnce($scope, $attrs.ngModel, renderPermissions)\n\n return {link:link}\n\nmodule.directive(\"tgRolePermissions\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\",\n RolePermissionsDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/admin/third-parties.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\nbindMethods = @.taiga.bindMethods\ndebounce = @.taiga.debounce\ntimeout = @.taiga.timeout\n\nmodule = angular.module(\"taigaAdmin\")\n\n\n#############################################################################\n## Webhooks\n#############################################################################\n\nclass WebhooksController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @location, @navUrls, @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = \"ADMIN.WEBHOOKS.SECTION_NAME\"\n @scope.project = {}\n\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.WEBHOOKS.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"webhooks:reload\", @.loadWebhooks\n\n loadWebhooks: ->\n return @rs.webhooks.list(@scope.projectId).then (webhooks) =>\n @scope.webhooks = webhooks\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n if not project.i_am_owner\n @location.path(@navUrls.resolve(\"permission-denied\"))\n\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then =>\n @.loadWebhooks()\n\n return promise\n\nmodule.controller(\"WebhooksController\", WebhooksController)\n\n\n#############################################################################\n## Webhook Directive\n#############################################################################\n\nWebhookDirective = ($rs, $repo, $confirm, $loading, $translate) ->\n link = ($scope, $el, $attrs) ->\n webhook = $scope.$eval($attrs.tgWebhook)\n\n updateLogs = () ->\n prettyDate = $translate.instant(\"ADMIN.WEBHOOKS.DATE\")\n\n $rs.webhooklogs.list(webhook.id).then (webhooklogs) =>\n for log in webhooklogs\n log.validStatus = 200 <= log.status < 300\n log.prettySentHeaders = _.map(_.pairs(log.request_headers), ([header, value]) -> \"#{header}: #{value}\").join(\"\\n\")\n log.prettySentData = JSON.stringify(log.request_data)\n log.prettyDate = moment(log.created).format(prettyDate)\n\n webhook.logs_counter = webhooklogs.length\n webhook.logs = webhooklogs\n updateShowHideHistoryText()\n\n updateShowHideHistoryText = () ->\n textElement = $el.find(\".toggle-history\")\n historyElement = textElement.parents(\".single-webhook-wrapper\").find(\".webhooks-history\")\n\n if historyElement.hasClass(\"open\")\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY\")\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY_TITLE\")\n else\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY\")\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY_TITLE\")\n\n textElement.text(text)\n textElement.prop(\"title\", title)\n\n showVisualizationMode = () ->\n $el.find(\".edition-mode\").addClass(\"hidden\")\n $el.find(\".visualization-mode\").removeClass(\"hidden\")\n\n showEditMode = () ->\n $el.find(\".visualization-mode\").addClass(\"hidden\")\n $el.find(\".edition-mode\").removeClass(\"hidden\")\n\n openHistory = () ->\n $el.find(\".webhooks-history\").addClass(\"open\")\n\n cancel = () ->\n showVisualizationMode()\n $scope.$apply ->\n webhook.revert()\n\n save = debounce 2000, (target) ->\n form = target.parents(\"form\").checksley()\n return if not form.validate()\n promise = $repo.save(webhook)\n promise.then =>\n showVisualizationMode()\n\n promise.then null, (data) ->\n $confirm.notify(\"error\")\n form.setErrors(data)\n\n $el.on \"click\", \".test-webhook\", () ->\n openHistory()\n $rs.webhooks.test(webhook.id).then =>\n updateLogs()\n\n $el.on \"click\", \".edit-webhook\", () ->\n showEditMode()\n\n $el.on \"click\", \".cancel-existing\", () ->\n cancel()\n\n $el.on \"click\", \".edit-existing\", (event) ->\n event.preventDefault()\n target = angular.element(event.currentTarget)\n save(target)\n\n $el.on \"keyup\", \".edition-mode input\", (event) ->\n if event.keyCode == 13\n target = angular.element(event.currentTarget)\n save(target)\n else if event.keyCode == 27\n target = angular.element(event.currentTarget)\n cancel(target)\n\n $el.on \"click\", \".delete-webhook\", () ->\n title = $translate.instant(\"ADMIN.WEBHOOKS.DELETE\")\n message = $translate.instant(\"ADMIN.WEBHOOKS.WEBHOOK_NAME\", {name: webhook.name})\n\n $confirm.askOnDelete(title, message).then (askResponse) =>\n onSucces = ->\n askResponse.finish()\n $scope.$emit(\"webhooks:reload\")\n\n onError = ->\n askResponse.finish(false)\n $confirm.notify(\"error\")\n\n $repo.remove(webhook).then(onSucces, onError)\n\n $el.on \"click\", \".toggle-history\", (event) ->\n target = angular.element(event.currentTarget)\n if not webhook.logs? or webhook.logs.length == 0\n updateLogs().then ->\n #Waiting for ng-repeat to finish\n timeout 0, ->\n $el.find(\".webhooks-history\").toggleClass(\"open\")\n updateShowHideHistoryText()\n\n else\n $el.find(\".webhooks-history\").toggleClass(\"open\")\n $scope.$apply () ->\n updateShowHideHistoryText()\n\n\n $el.on \"click\", \".history-single\", (event) ->\n target = angular.element(event.currentTarget)\n target.toggleClass(\"history-single-open\")\n target.siblings(\".history-single-response\").toggleClass(\"open\")\n\n $el.on \"click\", \".resend-request\", (event) ->\n target = angular.element(event.currentTarget)\n log = target.data(\"log\")\n $rs.webhooklogs.resend(log).then () =>\n updateLogs()\n\n return {link:link}\n\nmodule.directive(\"tgWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$translate\",\n WebhookDirective])\n\n\n#############################################################################\n## New webhook Directive\n#############################################################################\n\nNewWebhookDirective = ($rs, $repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n webhook = $scope.$eval($attrs.tgWebhook)\n formDOMNode = $el.find(\".new-webhook-form\")\n addWebhookDOMNode = $el.find(\".add-webhook\")\n initializeNewValue = ->\n $scope.newValue = {\n \"name\": \"\"\n \"url\": \"\"\n \"key\": \"\"\n }\n\n initializeNewValue()\n\n $scope.$watch \"webhooks\", (webhooks) ->\n if webhooks?\n if webhooks.length == 0\n formDOMNode.removeClass(\"hidden\")\n addWebhookDOMNode.addClass(\"hidden\")\n formDOMNode.find(\"input\")[0].focus()\n else\n formDOMNode.addClass(\"hidden\")\n addWebhookDOMNode.removeClass(\"hidden\")\n\n save = debounce 2000, () ->\n form = formDOMNode.checksley()\n return if not form.validate()\n\n $scope.newValue.project = $scope.project.id\n promise = $repo.create(\"webhooks\", $scope.newValue)\n promise.then =>\n $scope.$emit(\"webhooks:reload\")\n initializeNewValue()\n\n promise.then null, (data) ->\n $confirm.notify(\"error\")\n form.setErrors(data)\n\n formDOMNode.on \"click\", \".add-new\", (event) ->\n event.preventDefault()\n save()\n\n formDOMNode.on \"keyup\", \"input\", (event) ->\n if event.keyCode == 13\n save()\n\n formDOMNode.on \"click\", \".cancel-new\", (event) ->\n $scope.$apply ->\n initializeNewValue()\n\n addWebhookDOMNode.on \"click\", (event) ->\n formDOMNode.removeClass(\"hidden\")\n formDOMNode.find(\"input\")[0].focus()\n\n return {link:link}\n\nmodule.directive(\"tgNewWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", NewWebhookDirective])\n\n\n#############################################################################\n## Github Controller\n#############################################################################\n\nclass GithubController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"ADMIN.GITHUB.SECTION_NAME\")\n @scope.project = {}\n\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.GITHUB.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n loadModules: ->\n return @rs.modules.list(@scope.projectId, \"github\").then (github) =>\n @scope.github = github\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then(=> @.loadModules())\n return promise\n\nmodule.controller(\"GithubController\", GithubController)\n\n\n#############################################################################\n## Gitlab Controller\n#############################################################################\n\nclass GitlabController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"ADMIN.GITLAB.SECTION_NAME\")\n @scope.project = {}\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.GITLAB.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"project:modules:reload\", =>\n @.loadModules()\n\n loadModules: ->\n return @rs.modules.list(@scope.projectId, \"gitlab\").then (gitlab) =>\n @scope.gitlab = gitlab\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then(=> @.loadModules())\n return promise\n\nmodule.controller(\"GitlabController\", GitlabController)\n\n\n#############################################################################\n## Bitbucket Controller\n#############################################################################\n\nclass BitbucketController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"$scope\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$routeParams\",\n \"tgAppMetaService\",\n \"$translate\"\n ]\n\n constructor: (@scope, @repo, @rs, @params, @appMetaService, @translate) ->\n bindMethods(@)\n\n @scope.sectionName = @translate.instant(\"ADMIN.BITBUCKET.SECTION_NAME\")\n @scope.project = {}\n promise = @.loadInitialData()\n\n promise.then () =>\n title = @translate.instant(\"ADMIN.BITBUCKET.PAGE_TITLE\", {projectName: @scope.project.name})\n description = @scope.project.description\n @appMetaService.setAll(title, description)\n\n promise.then null, @.onInitialDataError.bind(@)\n\n @scope.$on \"project:modules:reload\", =>\n @.loadModules()\n\n loadModules: ->\n return @rs.modules.list(@scope.projectId, \"bitbucket\").then (bitbucket) =>\n @scope.bitbucket = bitbucket\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n return project\n\n loadInitialData: ->\n promise = @.loadProject()\n promise.then(=> @.loadModules())\n return promise\n\nmodule.controller(\"BitbucketController\", BitbucketController)\n\n\nSelectInputText = ->\n link = ($scope, $el, $attrs) ->\n $el.on \"click\", \".select-input-content\", () ->\n $el.find(\"input\").select()\n $el.find(\".help-copy\").addClass(\"visible\")\n\n return {link:link}\n\nmodule.directive(\"tgSelectInputText\", SelectInputText)\n\n\n#############################################################################\n## GithubWebhooks Directive\n#############################################################################\n\nGithubWebhooksDirective = ($repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.saveAttribute($scope.github, \"github\")\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link:link}\n\nmodule.directive(\"tgGithubWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", GithubWebhooksDirective])\n\n\n#############################################################################\n## GitlabWebhooks Directive\n#############################################################################\n\nGitlabWebhooksDirective = ($repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.saveAttribute($scope.gitlab, \"gitlab\")\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n $scope.$emit(\"project:modules:reload\")\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link:link}\n\nmodule.directive(\"tgGitlabWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", GitlabWebhooksDirective])\n\n\n#############################################################################\n## BitbucketWebhooks Directive\n#############################################################################\n\nBitbucketWebhooksDirective = ($repo, $confirm, $loading) ->\n link = ($scope, $el, $attrs) ->\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n return if not form.validate()\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.saveAttribute($scope.bitbucket, \"bitbucket\")\n promise.then ->\n currentLoading.finish()\n $confirm.notify(\"success\")\n $scope.$emit(\"project:modules:reload\")\n\n promise.then null, (data) ->\n currentLoading.finish()\n form.setErrors(data)\n if data._error_message\n $confirm.notify(\"error\", data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n return {link:link}\n\nmodule.directive(\"tgBitbucketWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", BitbucketWebhooksDirective])\n\n\n#############################################################################\n## Valid Origin IP's Directive\n#############################################################################\nValidOriginIpsDirective = ->\n link = ($scope, $el, $attrs, $ngModel) ->\n $ngModel.$parsers.push (value) ->\n value = $.trim(value)\n if value == \"\"\n return []\n\n return value.split(\",\")\n\n return {\n link: link\n restrict: \"EA\"\n require: \"ngModel\"\n }\n\nmodule.directive(\"tgValidOriginIps\", ValidOriginIpsDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/common/attachments.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ntimeout = @.taiga.timeout\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaProject\")\n\nCreateProject = ($rootscope, $repo, $confirm, $location, $navurls, $rs, $projectUrl, $loading, lightboxService, $cacheFactory, $translate, currentUserService) ->\n link = ($scope, $el, attrs) ->\n $scope.data = {}\n $scope.templates = []\n currentLoading = null\n\n form = $el.find(\"form\").checksley({\"onlyOneErrorElement\": true})\n\n onSuccessSubmit = (response) ->\n # remove all $http cache\n # This is necessary when a project is created with the same name\n # than another deleted in the same session\n $cacheFactory.get('$http').removeAll()\n\n currentLoading.finish()\n $rootscope.$broadcast(\"projects:reload\")\n\n $confirm.notify(\"success\", $translate.instant(\"COMMON.SAVE\"))\n\n $location.url($projectUrl.get(response))\n lightboxService.close($el)\n currentUserService.loadProjects()\n\n onErrorSubmit = (response) ->\n currentLoading.finish()\n form.setErrors(response)\n selectors = []\n for error_field in _.keys(response)\n selectors.push(\"[name=#{error_field}]\")\n $el.find(\".active\").removeClass(\"active\")\n error_step = $el.find(selectors.join(\",\")).first().parents(\".wizard-step\")\n error_step.addClass(\"active\")\n $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(error_step.data(\"step\"))\n\n submit = (event) =>\n event.preventDefault()\n\n if not form.validate()\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $repo.create(\"projects\", $scope.data)\n promise.then(onSuccessSubmit, onErrorSubmit)\n\n openLightbox = ->\n $scope.data = {}\n\n if !$scope.templates.length\n $rs.projects.templates().then (result) =>\n $scope.templates = result\n $scope.data.creation_template = _.head(_.filter($scope.templates, (x) -> x.slug == \"scrum\")).id\n else\n $scope.data.creation_template = _.head(_.filter($scope.templates, (x) -> x.slug == \"scrum\")).id\n\n $el.find(\".active\").removeClass(\"active\")\n $el.find(\".create-step1\").addClass(\"active\")\n\n lightboxService.open($el)\n timeout 600, ->\n $el.find(\".progress-bar\").addClass('step1')\n\n $el.on \"click\", \".button-next\", (event) ->\n event.preventDefault()\n\n current = $el.find(\".active\")\n\n valid = true\n for field in form.fields\n if current.find(\"[name=#{field.element.attr('name')}]\").length\n valid = field.validate() != false and valid\n\n if not valid\n return\n\n next = current.next()\n current.toggleClass('active')\n next.toggleClass('active')\n step = next.data('step')\n $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(step)\n\n $el.on \"click\", \".button-prev\", (event) ->\n event.preventDefault()\n current = $el.find(\".active\")\n prev = current.prev()\n current.toggleClass('active')\n prev.toggleClass('active')\n step = prev.data('step')\n $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(step)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $el.on \"click\", \".close\", (event) ->\n event.preventDefault()\n lightboxService.close($el)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n openLightbox()\n\n directive = {\n link: link,\n templateUrl: \"project/wizard-create-project.html\"\n scope: {}\n }\n\n return directive\n\n\nmodule.directive(\"tgLbCreateProject\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\",\n \"$location\", \"$tgNavUrls\", \"$tgResources\", \"$projectUrl\", \"$tgLoading\",\n \"lightboxService\", \"$cacheFactory\", \"$translate\", \"tgCurrentUserService\", CreateProject])\n\n\n#############################################################################\n## Delete Project Lightbox Directive\n#############################################################################\n\nDeleteProjectDirective = ($repo, $rootscope, $auth, $location, $navUrls, $confirm, lightboxService, tgLoader, currentUserService) ->\n link = ($scope, $el, $attrs) ->\n projectToDelete = null\n $scope.$on \"deletelightbox:new\", (ctx, project)->\n lightboxService.open($el)\n projectToDelete = project\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n submit = ->\n tgLoader.start()\n lightboxService.close($el)\n\n promise = $repo.remove(projectToDelete)\n\n promise.then (data) ->\n tgLoader.pageLoaded()\n $rootscope.$broadcast(\"projects:reload\")\n $location.path($navUrls.resolve(\"home\"))\n $confirm.notify(\"success\")\n currentUserService.loadProjects()\n\n # FIXME: error handling?\n promise.then null, ->\n $confirm.notify(\"error\")\n lightboxService.close($el)\n\n $el.on \"click\", \".button-red\", (event) ->\n event.preventDefault()\n lightboxService.close($el)\n\n $el.on \"click\", \".button-green\", (event) ->\n event.preventDefault()\n submit()\n\n return {link:link}\n\nmodule.directive(\"tgLbDeleteProject\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\",\n \"$tgConfirm\", \"lightboxService\", \"tgLoader\", \"tgCurrentUserService\", DeleteProjectDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/bind.coffee\n###\n\nbindOnce = @.taiga.bindOnce\n\n# Escape Html bind once directive\nBindOnceBindDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoBind, (val) ->\n $el.text(val)\n\n return {link:link}\n\n# Html bind once directive\nBindOnceHtmlDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoHtml, (val) ->\n $el.html(val)\n\n return {link:link}\n\n# Object reference bind once helper.\nBindOnceRefDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoRef, (val) ->\n $el.html(\"##{val} \")\n return {link:link}\n\n# Object src bind once helper.\nBindOnceSrcDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoSrc, (val) ->\n $el.attr(\"src\", val)\n return {link:link}\n\n# Object href bind once helper.\nBindOnceHrefDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoHref, (val) ->\n $el.attr(\"href\", val)\n return {link:link}\n\n# Object alt bind once helper.\nBindOnceAltDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoAlt, (val) ->\n $el.attr(\"alt\", val)\n return {link:link}\n\n# Object title bind once helper.\nBindOnceTitleDirective = ->\n link = ($scope, $el, $attrs) ->\n bindOnce $scope, $attrs.tgBoTitle, (val) ->\n $el.attr(\"title\", val)\n return {link:link}\n\nBindTitleDirective = ->\n link = ($scope, $el, $attrs) ->\n $scope.$watch $attrs.tgTitleHtml, (val) ->\n $el.attr(\"title\", val) if val?\n\n return {link:link}\n\nBindHtmlDirective = ->\n link = ($scope, $el, $attrs) ->\n $scope.$watch $attrs.tgBindHtml, (val) ->\n $el.html(val) if val?\n\n return {link:link}\n\nmodule = angular.module(\"taigaBase\")\nmodule.directive(\"tgBoBind\", BindOnceBindDirective)\nmodule.directive(\"tgBoHtml\", BindOnceHtmlDirective)\nmodule.directive(\"tgBoRef\", BindOnceRefDirective)\nmodule.directive(\"tgBoSrc\", BindOnceSrcDirective)\nmodule.directive(\"tgBoHref\", BindOnceHrefDirective)\nmodule.directive(\"tgBoAlt\", BindOnceAltDirective)\nmodule.directive(\"tgBoTitle\", BindOnceTitleDirective)\nmodule.directive(\"tgBindTitle\", BindTitleDirective)\nmodule.directive(\"tgBindHtml\", BindHtmlDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/conf.coffee\n###\n\nclass ConfigurationService\n constructor: () ->\n @.config = window.taigaConfig\n\n get: (key, defaultValue=null) ->\n if _.has(@.config, key)\n return @.config[key]\n return defaultValue\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service(\"$tgConfig\", ConfigurationService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/contrib.coffee\n###\n\ntaigaContribPlugins = @.taigaContribPlugins = @.taigaContribPlugins or []\n\nclass ContribController extends taiga.Controller\n @.$inject = [\n \"$rootScope\",\n \"$scope\",\n \"$routeParams\",\n \"$tgRepo\",\n \"$tgResources\",\n \"$tgConfirm\"\n ]\n\n constructor: (@rootScope, @scope, @params, @repo, @rs, @confirm) ->\n @scope.adminPlugins = _.where(@rootScope.contribPlugins, {\"type\": \"admin\"})\n @scope.currentPlugin = _.first(_.where(@scope.adminPlugins, {\"slug\": @params.plugin}))\n @scope.pluginTemplate = \"contrib/#{@scope.currentPlugin.slug}\"\n @scope.projectSlug = @params.pslug\n\n promise = @.loadInitialData()\n\n promise.then null, =>\n @confirm.notify(\"error\")\n\n loadProject: ->\n return @rs.projects.getBySlug(@params.pslug).then (project) =>\n @scope.projectId = project.id\n @scope.project = project\n @scope.$emit('project:loaded', project)\n @scope.$broadcast('project:loaded', project)\n return project\n\n loadInitialData: ->\n return @.loadProject()\n\nmodule = angular.module(\"taigaBase\")\nmodule.controller(\"ContribController\", ContribController)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/filters.coffee\n###\n\n\ntaiga = @.taiga\n\nclass FiltersStorageService extends taiga.Service\n @.$inject = [\"$tgStorage\", \"$routeParams\"]\n\n constructor: (@storage, @params) ->\n\n generateHash: (components=[]) ->\n components = _.map(components, (x) -> JSON.stringify(x))\n return hex_sha1(components.join(\":\"))\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/http.coffee\n###\n\ntaiga = @.taiga\n\nclass HttpService extends taiga.Service\n @.$inject = [\"$http\", \"$q\", \"$tgStorage\", \"$rootScope\", \"$cacheFactory\", \"$translate\"]\n\n constructor: (@http, @q, @storage, @rootScope, @cacheFactory, @translate) ->\n super()\n\n @.cache = @cacheFactory(\"httpget\");\n headers: ->\n headers = {}\n\n # Authorization\n token = @storage.get('token')\n if token\n headers[\"Authorization\"] = \"Bearer #{token}\"\n\n # Accept-Language\n lang = @translate.preferredLanguage()\n if lang\n headers[\"Accept-Language\"] = lang\n\n return headers\n\n request: (options) ->\n options.headers = _.merge({}, options.headers or {}, @.headers())\n if _.isPlainObject(options.data)\n options.data = JSON.stringify(options.data)\n\n return @http(options)\n\n get: (url, params, options) ->\n options = _.merge({method: \"GET\", url: url}, options)\n options.params = params if params\n\n # prevent duplicated http request\n options.cache = @.cache\n\n return @.request(options).finally (data) =>\n @.cache.removeAll()\n\n post: (url, data, params, options) ->\n options = _.merge({method: \"POST\", url: url}, options)\n options.data = data if data\n options.params = params if params\n return @.request(options)\n\n put: (url, data, params, options) ->\n options = _.merge({method: \"PUT\", url: url}, options)\n options.data = data if data\n options.params = params if params\n return @.request(options)\n\n patch: (url, data, params, options) ->\n options = _.merge({method: \"PATCH\", url: url}, options)\n options.data = data if data\n options.params = params if params\n return @.request(options)\n\n delete: (url, data, params, options) ->\n options = _.merge({method: \"DELETE\", url: url}, options)\n options.data = data if data\n options.params = params if params\n return @.request(options)\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service(\"$tgHttp\", HttpService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/location.coffee\n###\n\n\nlocationFactory = ($location, $route, $rootscope) ->\n $location.noreload = (scope) ->\n lastRoute = $route.current\n un = scope.$on \"$locationChangeSuccess\", ->\n $route.current = lastRoute\n un()\n\n return $location\n\n $location.isInCurrentRouteParams = (name, value) ->\n params = $location.search() || {}\n\n return params[name] == value\n\n return $location\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.factory(\"$tgLocation\", [\"$location\", \"$route\", \"$rootScope\", locationFactory])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/model.coffee\n###\n\nclass Model\n constructor: (name, data, dataTypes) ->\n @._attrs = data\n @._name = name\n @._dataTypes = dataTypes\n\n @.setAttrs(data)\n @.initialize()\n\n clone: ->\n instance = new Model(@._name, @._attrs, @._dataTypes)\n instance._modifiedAttrs = @._modifiedAttrs\n instance._isModified = @._isModified\n return instance\n\n applyCasts: ->\n for attrName, castName of @._dataTypes\n castMethod = service.casts[castName]\n if not castMethod\n continue\n\n @._attrs[attrName] = castMethod(@._attrs[attrName])\n\n getIdAttrName: ->\n return \"id\"\n\n getName: ->\n return @._name\n\n getAttrs: (patch=false) ->\n if @._attrs.version?\n @._modifiedAttrs.version = @._attrs.version\n\n if patch\n return _.extend({}, @._modifiedAttrs)\n return _.extend({}, @._attrs, @._modifiedAttrs)\n\n setAttrs: (attrs) ->\n @._attrs = attrs\n @._modifiedAttrs = {}\n\n @.applyCasts()\n @._isModified = false\n\n setAttr: (name, value) ->\n @._modifiedAttrs[name] = value\n @._isModified = true\n\n initialize: () ->\n self = @\n\n getter = (name) ->\n return ->\n if typeof(name) == 'string' and name.substr(0,2) == \"__\"\n return self[name]\n\n if name not in _.keys(self._modifiedAttrs)\n return self._attrs[name]\n\n return self._modifiedAttrs[name]\n\n setter = (name) ->\n return (value) ->\n if typeof(name) == 'string' and name.substr(0,2) == \"__\"\n self[name] = value\n return\n\n if self._attrs[name] != value\n self._modifiedAttrs[name] = value\n self._isModified = true\n else\n delete self._modifiedAttrs[name]\n\n return\n\n _.each @_attrs, (value, name) ->\n options =\n get: getter(name)\n set: setter(name)\n enumerable: true\n configurable: true\n\n Object.defineProperty(self, name, options)\n\n serialize: () ->\n data =\n \"data\": _.clone(@_attrs)\n \"name\": @_name\n\n return JSON.stringify(data)\n\n isModified: ->\n return this._isModified\n\n isAttributeModified: (attribute) ->\n return @._modifiedAttrs[attribute]?\n\n markSaved: () ->\n @._isModified = false\n @._attrs = @.getAttrs()\n @._modifiedAttrs = {}\n\n revert: () ->\n @_modifiedAttrs = {}\n @_isModified = false\n\n @desSerialize = (sdata) ->\n ddata = JSON.parse(sdata)\n model = new Model(ddata.url, ddata.data)\n return model\n\n\ntaiga = @.taiga\n\nclass ModelService extends taiga.Service\n @.$inject = [\"$q\", \"$tgUrls\", \"$tgStorage\", \"$tgHttp\"]\n\n constructor: (@q, @urls, @storage, @http) ->\n super()\n\nprovider = ($q, $http, $gmUrls, $gmStorage) ->\n service = {}\n service.make_model = (name, data, cls=Model, dataTypes={}) ->\n return new cls(name, data, dataTypes)\n\n service.cls = Model\n service.casts = {\n int: (value) ->\n return parseInt(value, 10)\n\n float: (value) ->\n return parseFloat(value, 10)\n }\n\n return service\n\nmodule = angular.module(\"taigaBase\")\nmodule.factory(\"$tgModel\", [\"$q\", \"$http\", \"$tgUrls\", \"$tgStorage\", provider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/navurl.coffee\n###\n\ntaiga = @.taiga\ntrim = @.taiga.trim\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaBase\")\n\n\n#############################################################################\n## Navigation Urls Service\n#############################################################################\n\nclass NavigationUrlsService extends taiga.Service\n constructor: ->\n @.urls = {}\n\n update: (urls) ->\n @.urls = _.merge({}, @.urls, urls or {})\n\n formatUrl: (url, ctx={}) ->\n replacer = (match) ->\n match = trim(match, \":\")\n return ctx[match] or \"undefined\"\n return url.replace(/(:\\w+)/g, replacer)\n\n resolve: (name, ctx) ->\n url = @.urls[name]\n return \"\" if not url\n return @.formatUrl(url, ctx) if ctx\n return url\n\nmodule.service(\"$tgNavUrls\", NavigationUrlsService)\n\n\n#############################################################################\n## Navigation Urls Directive\n#############################################################################\n\nNavigationUrlsDirective = ($navurls, $auth, $q, $location) ->\n # Example:\n # link(tg-nav=\"project-backlog:project='sss',\")\n\n # bindOnce version that uses $q for offer\n # promise based api\n bindOnceP = ($scope, attr) ->\n defered = $q.defer()\n bindOnce $scope, attr, (v) ->\n defered.resolve(v)\n return defered.promise\n\n parseNav = (data, $scope) ->\n [name, params] = _.map(data.split(\":\"), trim)\n if params\n # split by 'xxx='\n # example\n # project=vm.timeline.getIn(['data', 'project', 'slug']), ref=vm.timeline.getIn(['obj', 'ref'])\n # [\"\", \"project\", \"vm.timeline.getIn(['data', 'project', 'slug']), \", \"ref\", \"vm.timeline.getIn(['obj', 'ref'])\"]\n result = params.split(/(\\w+)=/)\n\n # remove empty string\n result = _.filter result, (str) -> return str.length\n\n # remove , at the end of the string\n result = _.map result, (str) -> return trim(str.replace(/,$/g, ''))\n\n params = []\n index = 0\n\n # ['param1', 'value'] => [{'param1': 'value'}]\n while index < result.length\n obj = {}\n obj[result[index]] = result[index + 1]\n params.push obj\n index = index + 2\n else\n params = []\n\n values = _.map params, (param) -> _.values(param)[0]\n promises = _.map(values, (x) -> bindOnceP($scope, x))\n\n return $q.all(promises).then ->\n options = {}\n for param in params\n key = Object.keys(param)[0]\n value = param[key]\n\n options[key] = $scope.$eval(value)\n return [name, options]\n\n link = ($scope, $el, $attrs) ->\n if $el.is(\"a\")\n $el.attr(\"href\", \"#\")\n\n $el.on \"mouseenter\", (event) ->\n target = $(event.currentTarget)\n\n if !target.data(\"fullUrl\")\n parseNav($attrs.tgNav, $scope).then (result) ->\n [name, options] = result\n user = $auth.getUser()\n options.user = user.username if user\n\n url = $navurls.resolve(name)\n fullUrl = $navurls.formatUrl(url, options)\n\n if $attrs.tgNavGetParams\n getURLParams = JSON.parse($attrs.tgNavGetParams)\n getURLParamsStr = $.param(getURLParams)\n fullUrl = \"#{fullUrl}?#{getURLParamsStr}\"\n\n target.data(\"fullUrl\", fullUrl)\n\n if target.is(\"a\")\n target.attr(\"href\", fullUrl)\n\n $el.on \"click\", (event) ->\n if event.metaKey || event.ctrlKey\n return\n\n event.preventDefault()\n target = $(event.currentTarget)\n\n if target.hasClass('noclick')\n return\n\n fullUrl = target.data(\"fullUrl\")\n\n switch event.which\n when 1\n $location.url(fullUrl)\n $scope.$apply()\n when 2\n window.open fullUrl\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link: link}\n\nmodule.directive(\"tgNav\", [\"$tgNavUrls\", \"$tgAuth\", \"$q\", \"$tgLocation\", NavigationUrlsDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/repository.coffee\n###\n\ntaiga = @.taiga\n\nclass RepositoryService extends taiga.Service\n @.$inject = [\"$q\", \"$tgModel\", \"$tgStorage\", \"$tgHttp\", \"$tgUrls\"]\n\n constructor: (@q, @model, @storage, @http, @urls) ->\n super()\n\n resolveUrlForModel: (model) ->\n idAttrName = model.getIdAttrName()\n return \"#{@urls.resolve(model.getName())}/#{model[idAttrName]}\"\n\n resolveUrlForAttributeModel: (model) ->\n return @urls.resolve(model.getName(), model.parent)\n\n create: (name, data, dataTypes={}, extraParams={}) ->\n defered = @q.defer()\n url = @urls.resolve(name)\n\n promise = @http.post(url, JSON.stringify(data))\n promise.success (_data, _status) =>\n defered.resolve(@model.make_model(name, _data, null, dataTypes))\n\n promise.error (data, status) =>\n defered.reject(data)\n\n return defered.promise\n\n remove: (model, params={}) ->\n defered = @q.defer()\n url = @.resolveUrlForModel(model)\n\n promise = @http.delete(url, {}, params)\n promise.success (data, status) ->\n defered.resolve(model)\n\n promise.error (data, status) ->\n defered.reject(model)\n\n return defered.promise\n\n saveAll: (models, patch=true) ->\n promises = _.map(models, (x) => @.save(x, true))\n return @q.all(promises)\n\n save: (model, patch=true) ->\n defered = @q.defer()\n\n if not model.isModified() and patch\n defered.resolve(model)\n return defered.promise\n\n url = @.resolveUrlForModel(model)\n data = JSON.stringify(model.getAttrs(patch))\n\n if patch\n promise = @http.patch(url, data)\n else\n promise = @http.put(url, data)\n\n promise.success (data, status) =>\n model._isModified = false\n model._attrs = _.extend(model.getAttrs(), data)\n model._modifiedAttrs = {}\n\n model.applyCasts()\n defered.resolve(model)\n\n promise.error (data, status) ->\n defered.reject(data)\n\n return defered.promise\n\n saveAttribute: (model, attribute, patch=true) ->\n defered = @q.defer()\n\n if not model.isModified() and patch\n defered.resolve(model)\n return defered.promise\n\n url = @.resolveUrlForAttributeModel(model)\n\n data = {}\n\n data[attribute] = model.getAttrs()\n\n if patch\n promise = @http.patch(url, data)\n else\n promise = @http.put(url, data)\n\n promise.success (data, status) =>\n model._isModified = false\n model._attrs = _.extend(model.getAttrs(), data)\n model._modifiedAttrs = {}\n\n model.applyCasts()\n defered.resolve(model)\n\n promise.error (data, status) ->\n defered.reject(data)\n\n return defered.promise\n\n refresh: (model) ->\n defered = @q.defer()\n\n url = @.resolveUrlForModel(model)\n promise = @http.get(url)\n promise.success (data, status) ->\n model._modifiedAttrs = {}\n model._attrs = data\n model._isModified = false\n model.applyCasts()\n defered.resolve(model)\n\n promise.error (data, status) ->\n defered.reject(data)\n\n return defered.promise\n\n queryMany: (name, params, options={}, headers=false) ->\n url = @urls.resolve(name)\n httpOptions = {headers: {}}\n\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n\n return @http.get(url, params, httpOptions).then (data) =>\n result = _.map(data.data, (x) => @model.make_model(name, x))\n\n if headers\n return [result, data.headers]\n\n return result\n\n queryOneAttribute: (name, id, attribute, params, options={}) ->\n url = @urls.resolve(name, id)\n httpOptions = {headers: {}}\n\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n\n return @http.get(url, params, httpOptions).then (data) =>\n model = @model.make_model(name, data.data[attribute])\n model.parent = id\n\n return model\n\n queryOne: (name, id, params, options={}) ->\n url = @urls.resolve(name)\n url = \"#{url}/#{id}\" if id\n httpOptions = {headers: {}}\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n\n return @http.get(url, params, httpOptions).then (data) =>\n return @model.make_model(name, data.data)\n\n queryOneRaw: (name, id, params, options={}) ->\n url = @urls.resolve(name)\n url = \"#{url}/#{id}\" if id\n httpOptions = _.merge({headers: {}}, options)\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n return @http.get(url, params, httpOptions).then (data) =>\n return data.data\n\n queryPaginated: (name, params, options={}) ->\n url = @urls.resolve(name)\n httpOptions = _.merge({headers: {}}, options)\n return @http.get(url, params, httpOptions).then (data) =>\n headers = data.headers()\n result = {}\n result.models = _.map(data.data, (x) => @model.make_model(name, x))\n result.count = parseInt(headers[\"x-pagination-count\"], 10)\n result.current = parseInt(headers[\"x-pagination-current\"] or 1, 10)\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10)\n return result\n\n queryOnePaginatedRaw: (name, id, params, options={}) ->\n url = @urls.resolve(name)\n url = \"#{url}/#{id}\" if id\n httpOptions = _.merge({headers: {}}, options)\n\n return @http.get(url, params, httpOptions).then (data) =>\n headers = data.headers()\n result = {}\n result.data = data.data\n result.count = parseInt(headers[\"x-pagination-count\"], 10)\n result.current = parseInt(headers[\"x-pagination-current\"] or 1, 10)\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10)\n\n return result\n\n resolve: (options) ->\n params = {}\n params.project = options.pslug if options.pslug?\n params.us = options.usref if options.usref?\n params.task = options.taskref if options.taskref?\n params.issue = options.issueref if options.issueref?\n params.milestone = options.sslug if options.sslug?\n params.wikipage = options.wikipage if options.wikipage?\n\n cache = not (options.wikipage or options.sslug)\n return @.queryOneRaw(\"resolver\", null, params, {cache: cache})\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service(\"$tgRepo\", RepositoryService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/storage.coffee\n###\n\ntaiga = @.taiga\n\nclass StorageService extends taiga.Service\n @.$inject = [\"$rootScope\"]\n\n constructor: ($rootScope) ->\n super()\n\n get: (key, _default) ->\n serializedValue = localStorage.getItem(key)\n if serializedValue == null\n return _default or null\n\n return JSON.parse(serializedValue)\n\n set: (key, val) ->\n if _.isObject(key)\n _.each key, (val, key) =>\n @set(key, val)\n else\n localStorage.setItem(key, JSON.stringify(val))\n\n contains: (key) ->\n value = @.get(key)\n return (value != null)\n\n remove: (key) ->\n localStorage.removeItem(key)\n\n clear: ->\n localStorage.clear()\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service(\"$tgStorage\", StorageService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/base/http.coffee\n###\n\nformat = (fmt, obj) ->\n obj = _.clone(obj)\n return fmt.replace /%s/g, (match) -> String(obj.shift())\n\ntaiga = @.taiga\n\nclass UrlsService extends taiga.Service\n @.$inject = [\"$tgConfig\"]\n\n constructor: (@config) ->\n @.urls = {}\n @.mainUrl = @config.get(\"api\")\n\n update: (urls) ->\n @.urls = _.merge(@.urls, urls)\n\n resolve: ->\n args = _.toArray(arguments)\n\n if args.length == 0\n throw Error(\"wrong arguments to setUrls\")\n\n name = args.slice(0, 1)[0]\n url = format(@.urls[name], args.slice(1))\n\n return format(\"%s/%s\", [\n _.str.rtrim(@.mainUrl, \"/\"),\n _.str.ltrim(url, \"/\")\n ])\n\n resolveAbsolute: ->\n url = @.resolve.apply(@, arguments)\n if (/^https?:\\/\\//i).test(url)\n return url\n if (/^\\//).test(url)\n return \"#{window.location.protocol}//#{window.location.host}#{url}\"\n return \"#{window.location.protocol}//#{window.location.host}/#{url}\"\n\n\nmodule = angular.module(\"taigaBase\")\nmodule.service('$tgUrls', UrlsService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/attachments.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($rootScope, $config, $urls, $model, $repo, $auth, $q) ->\n service = {}\n\n service.list = (urlName, objectId, projectId) ->\n params = {object_id: objectId, project: projectId}\n return $repo.queryMany(urlName, params)\n\n service.create = (urlName, projectId, objectId, file) ->\n defered = $q.defer()\n\n if file is undefined\n defered.reject(null)\n return defered.promise\n\n maxFileSize = $config.get(\"maxUploadFileSize\", null)\n if maxFileSize and file.size > maxFileSize\n response = {\n status: 413,\n data: _error_message: \"'#{file.name}' (#{sizeFormat(file.size)}) is too heavy for our oompa\n loompas, try it with a smaller than (#{sizeFormat(maxFileSize)})\"\n }\n defered.reject(response)\n return defered.promise\n\n uploadProgress = (evt) =>\n $rootScope.$apply =>\n file.status = \"in-progress\"\n file.size = sizeFormat(evt.total)\n file.progressMessage = \"upload #{sizeFormat(evt.loaded)} of #{sizeFormat(evt.total)}\"\n file.progressPercent = \"#{Math.round((evt.loaded / evt.total) * 100)}%\"\n\n uploadComplete = (evt) =>\n $rootScope.$apply ->\n file.status = \"done\"\n\n status = evt.target.status\n try\n data = JSON.parse(evt.target.responseText)\n catch\n data = {}\n\n if status >= 200 and status < 400\n model = $model.make_model(urlName, data)\n defered.resolve(model)\n else\n response = {\n status: status,\n data: {_error_message: data['attached_file']?[0]}\n }\n defered.reject(response)\n\n uploadFailed = (evt) =>\n $rootScope.$apply ->\n file.status = \"error\"\n defered.reject(\"fail\")\n\n data = new FormData()\n data.append(\"project\", projectId)\n data.append(\"object_id\", objectId)\n data.append(\"attached_file\", file)\n\n xhr = new XMLHttpRequest()\n xhr.upload.addEventListener(\"progress\", uploadProgress, false)\n xhr.addEventListener(\"load\", uploadComplete, false)\n xhr.addEventListener(\"error\", uploadFailed, false)\n\n xhr.open(\"POST\", $urls.resolve(urlName))\n xhr.setRequestHeader(\"Authorization\", \"Bearer #{$auth.getToken()}\")\n xhr.setRequestHeader('Accept', 'application/json')\n xhr.send(data)\n\n return defered.promise\n\n return (instance) ->\n instance.attachments = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgAttachmentsResourcesProvider\", [\"$rootScope\", \"$tgConfig\", \"$tgUrls\", \"$tgModel\", \"$tgRepo\",\n \"$tgAuth\", \"$q\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/custom-field-values.coffee\n###\n\ntaiga = @.taiga\n\nresourceProvider = ($repo) ->\n _get = (objectId, resource) ->\n return $repo.queryOne(resource, objectId)\n\n service = {\n userstory: {\n get: (objectId) -> _get(objectId, \"custom-attributes-values/userstory\")\n }\n task: {\n get: (objectId) -> _get(objectId, \"custom-attributes-values/task\")\n }\n issue: {\n get: (objectId) -> _get(objectId, \"custom-attributes-values/issue\")\n }\n }\n\n return (instance) ->\n instance.customAttributesValues = service\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgCustomAttributesValuesResourcesProvider\", [\"$tgRepo\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/projects.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($repo) ->\n _list = (projectId, resource) ->\n return $repo.queryMany(resource, {project: projectId})\n\n service = {\n userstory:{\n list: (projectId) -> _list(projectId, \"custom-attributes/userstory\")\n }\n task:{\n list: (projectId) -> _list(projectId, \"custom-attributes/task\")\n }\n issue: {\n list: (projectId) -> _list(projectId, \"custom-attributes/issue\")\n }\n }\n\n return (instance) ->\n instance.customAttributes = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgCustomAttributesResourcesProvider\", [\"$tgRepo\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/history.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (type, objectId) ->\n return $repo.queryOneRaw(\"history/#{type}\", objectId)\n\n service.deleteComment = (type, objectId, activityId) ->\n url = $urls.resolve(\"history/#{type}\")\n url = \"#{url}/#{objectId}/delete_comment\"\n params = {id: activityId}\n return $http.post(url, null, params).then (data) =>\n return data.data\n\n service.undeleteComment = (type, objectId, activityId) ->\n url = $urls.resolve(\"history/#{type}\")\n url = \"#{url}/#{objectId}/undelete_comment\"\n params = {id: activityId}\n return $http.post(url, null, params).then (data) =>\n return data.data\n\n return (instance) ->\n instance.history = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgHistoryResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/projects.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo) ->\n service = {}\n\n service.get = (token) ->\n return $repo.queryOne(\"invitations\", token)\n\n return (instance) ->\n instance.invitations = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgInvitationsResourcesProvider\", [\"$tgRepo\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/issues.coffee\n###\n\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($repo, $http, $urls, $storage, $q) ->\n service = {}\n hashSuffix = \"issues-queryparams\"\n filtersHashSuffix = \"issues-filters\"\n myFiltersHashSuffix = \"issues-my-filters\"\n\n service.get = (projectId, issueId) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n return $repo.queryOne(\"issues\", issueId, params)\n\n service.getByRef = (projectId, ref) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n params.ref = ref\n return $repo.queryOne(\"issues\", \"by_ref\", params)\n\n service.listInAllProjects = (filters) ->\n return $repo.queryMany(\"issues\", filters)\n\n service.list = (projectId, filters, options) ->\n params = {project: projectId}\n params = _.extend({}, params, filters or {})\n service.storeQueryParams(projectId, params)\n return $repo.queryPaginated(\"issues\", params, options)\n\n service.bulkCreate = (projectId, data) ->\n url = $urls.resolve(\"bulk-create-issues\")\n params = {project_id: projectId, bulk_issues: data}\n return $http.post(url, params)\n\n service.upvote = (issueId) ->\n url = $urls.resolve(\"issue-upvote\", issueId)\n return $http.post(url)\n\n service.downvote = (issueId) ->\n url = $urls.resolve(\"issue-downvote\", issueId)\n return $http.post(url)\n\n service.watch = (issueId) ->\n url = $urls.resolve(\"issue-watch\", issueId)\n return $http.post(url)\n\n service.unwatch = (issueId) ->\n url = $urls.resolve(\"issue-unwatch\", issueId)\n return $http.post(url)\n\n service.stats = (projectId) ->\n return $repo.queryOneRaw(\"projects\", \"#{projectId}/issues_stats\")\n\n service.filtersData = (params) ->\n return $repo.queryOneRaw(\"issues-filters\", null, params)\n\n service.listValues = (projectId, type) ->\n params = {\"project\": projectId}\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(type, params)\n\n service.storeQueryParams = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getQueryParams = (projectId) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeFilters = (projectSlug, params) ->\n ns = \"#{projectSlug}:#{filtersHashSuffix}\"\n hash = generateHash([projectSlug, ns])\n $storage.set(hash, params)\n\n service.getFilters = (projectSlug) ->\n ns = \"#{projectSlug}:#{filtersHashSuffix}\"\n hash = generateHash([projectSlug, ns])\n return $storage.get(hash) or {}\n\n service.storeMyFilters = (projectId, myFilters) ->\n deferred = $q.defer()\n url = $urls.resolve(\"user-storage\")\n ns = \"#{projectId}:#{myFiltersHashSuffix}\"\n hash = generateHash([projectId, ns])\n if _.isEmpty(myFilters)\n promise = $http.delete(\"#{url}/#{hash}\", {key: hash, value:myFilters})\n promise.then ->\n deferred.resolve()\n promise.then null, ->\n deferred.reject()\n else\n promise = $http.put(\"#{url}/#{hash}\", {key: hash, value:myFilters})\n promise.then (data) ->\n deferred.resolve()\n promise.then null, (data) ->\n innerPromise = $http.post(\"#{url}\", {key: hash, value:myFilters})\n innerPromise.then ->\n deferred.resolve()\n innerPromise.then null, ->\n deferred.reject()\n return deferred.promise\n\n service.getMyFilters = (projectId) ->\n deferred = $q.defer()\n url = $urls.resolve(\"user-storage\")\n ns = \"#{projectId}:#{myFiltersHashSuffix}\"\n hash = generateHash([projectId, ns])\n\n promise = $http.get(\"#{url}/#{hash}\")\n promise.then (data) ->\n deferred.resolve(data.data.value)\n promise.then null, (data) ->\n deferred.resolve({})\n\n return deferred.promise\n\n return (instance) ->\n instance.issues = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgIssuesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", \"$q\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/kanban.coffee\n###\n\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($storage) ->\n service = {}\n hashSuffixStatusViewModes = \"kanban-statusviewmodels\"\n hashSuffixStatusColumnModes = \"kanban-statuscolumnmodels\"\n\n service.storeStatusViewModes = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffixStatusViewModes}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getStatusViewModes = (projectId) ->\n ns = \"#{projectId}:#{hashSuffixStatusViewModes}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeStatusColumnModes = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffixStatusColumnModes}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getStatusColumnModes = (projectId) ->\n ns = \"#{projectId}:#{hashSuffixStatusColumnModes}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n return (instance) ->\n instance.kanban = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgKanbanResourcesProvider\", [\"$tgStorage\", resourceProvider])\n","###\n# Copyright (C) 2015 Andrey Antukh \n# Copyright (C) 2015 Jesús Espino Garcia \n# Copyright (C) 2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/locales.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($repo) ->\n service = {\n list: -> return $repo.queryMany(\"locales\")\n }\n\n return (instance) ->\n instance.locales = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgLocalesResourcesProvider\", [\"$tgRepo\", resourceProvider])\n\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/mdrender.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $urls, $http) ->\n service = {}\n\n service.render = (projectId, content) ->\n # We can't use an empty content\n content = ' ' if not content? or content == \"\"\n\n params = {\n project_id: projectId\n content: content\n }\n url = $urls.resolve(\"wiki\")\n return $http.post(\"#{url}/render\", params).then (data) =>\n return data.data\n\n return (instance) ->\n instance.mdrender = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgMdRenderResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/memberships.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (id) ->\n return $repo.queryOne(\"memberships\", id)\n\n service.list = (projectId, filters, enablePagination=true) ->\n params = {project: projectId}\n params = _.extend({}, params, filters or {})\n if enablePagination\n return $repo.queryPaginated(\"memberships\", params)\n\n return $repo.queryMany(\"memberships\", params, options={enablePagination:enablePagination})\n\n service.listByUser = (userId, filters) ->\n params = {user: userId}\n params = _.extend({}, params, filters or {})\n return $repo.queryPaginated(\"memberships\", params)\n\n service.resendInvitation = (id) ->\n url = $urls.resolve(\"memberships\")\n return $http.post(\"#{url}/#{id}/resend_invitation\", {})\n\n service.bulkCreateMemberships = (projectId, data, invitation_extra_text) ->\n url = $urls.resolve(\"bulk-create-memberships\")\n params = {project_id: projectId, bulk_memberships: data, invitation_extra_text: invitation_extra_text}\n return $http.post(url, params)\n\n return (instance) ->\n instance.memberships = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgMembershipsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules.coffee\n###\n\nresourceProvider = ($repo) ->\n service = {}\n\n service.list = (projectId, module) ->\n return $repo.queryOneAttribute(\"project-modules\", projectId, module)\n\n return (instance) ->\n instance.modules = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgModulesResourcesProvider\", [\"$tgRepo\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/memberships.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (id) ->\n return $repo.queryOne(\"notify-policies\", id)\n\n service.list = (filters) ->\n params = _.extend({}, params, filters or {})\n return $repo.queryMany(\"notify-policies\", params)\n\n return (instance) ->\n instance.notifyPolicies = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgNotifyPoliciesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/projects.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($config, $repo, $http, $urls, $auth, $q, $translate) ->\n service = {}\n\n service.get = (projectId) ->\n return $repo.queryOne(\"projects\", projectId)\n\n service.getBySlug = (projectSlug) ->\n return $repo.queryOne(\"projects\", \"by_slug?slug=#{projectSlug}\")\n\n service.list = ->\n return $repo.queryMany(\"projects\")\n\n service.listByMember = (memberId) ->\n params = {\"member\": memberId, \"order_by\": \"memberships__user_order\"}\n return $repo.queryMany(\"projects\", params)\n\n service.templates = ->\n return $repo.queryMany(\"project-templates\")\n\n service.usersList = (projectId) ->\n params = {\"project\": projectId}\n return $repo.queryMany(\"users\", params)\n\n service.rolesList = (projectId) ->\n params = {\"project\": projectId}\n return $repo.queryMany(\"roles\", params)\n\n service.stats = (projectId) ->\n return $repo.queryOneRaw(\"projects\", \"#{projectId}/stats\")\n\n service.bulkUpdateOrder = (bulkData) ->\n url = $urls.resolve(\"bulk-update-projects-order\")\n return $http.post(url, bulkData)\n\n service.regenerate_userstories_csv_uuid = (projectId) ->\n url = \"#{$urls.resolve(\"projects\")}/#{projectId}/regenerate_userstories_csv_uuid\"\n return $http.post(url)\n\n service.regenerate_issues_csv_uuid = (projectId) ->\n url = \"#{$urls.resolve(\"projects\")}/#{projectId}/regenerate_issues_csv_uuid\"\n return $http.post(url)\n\n service.regenerate_tasks_csv_uuid = (projectId) ->\n url = \"#{$urls.resolve(\"projects\")}/#{projectId}/regenerate_tasks_csv_uuid\"\n return $http.post(url)\n\n service.leave = (projectId) ->\n url = \"#{$urls.resolve(\"projects\")}/#{projectId}/leave\"\n return $http.post(url)\n\n service.memberStats = (projectId) ->\n return $repo.queryOneRaw(\"projects\", \"#{projectId}/member_stats\")\n\n service.tagsColors = (projectId) ->\n return $repo.queryOne(\"projects\", \"#{projectId}/tags_colors\")\n\n service.export = (projectId) ->\n url = \"#{$urls.resolve(\"exporter\")}/#{projectId}\"\n return $http.get(url)\n\n service.import = (file, statusUpdater) ->\n defered = $q.defer()\n\n maxFileSize = $config.get(\"maxUploadFileSize\", null)\n if maxFileSize and file.size > maxFileSize\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name\n fileSize: sizeFormat(file.size)\n maxFileSize: sizeFormat(maxFileSize)\n })\n\n response = {\n status: 413,\n data: _error_message: errorMsg\n }\n defered.reject(response)\n return defered.promise\n\n uploadProgress = (evt) =>\n percent = Math.round((evt.loaded / evt.total) * 100)\n message = $translate.instant(\"PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE\", {\n uploadedSize: sizeFormat(evt.loaded)\n totalSize: sizeFormat(evt.total)\n })\n statusUpdater(\"in-progress\", null, message, percent)\n\n uploadComplete = (evt) =>\n statusUpdater(\"done\",\n $translate.instant(\"PROJECT.IMPORT.TITLE\"),\n $translate.instant(\"PROJECT.IMPORT.DESCRIPTION\"))\n\n uploadFailed = (evt) =>\n statusUpdater(\"error\")\n\n complete = (evt) =>\n response = {}\n try\n response.data = JSON.parse(evt.target.responseText)\n catch\n response.data = {}\n response.status = evt.target.status\n\n defered.resolve(response) if response.status in [201, 202]\n defered.reject(response)\n\n failed = (evt) =>\n defered.reject(\"fail\")\n\n data = new FormData()\n data.append('dump', file)\n\n xhr = new XMLHttpRequest()\n xhr.upload.addEventListener(\"progress\", uploadProgress, false)\n xhr.upload.addEventListener(\"load\", uploadComplete, false)\n xhr.upload.addEventListener(\"error\", uploadFailed, false)\n xhr.upload.addEventListener(\"abort\", uploadFailed, false)\n xhr.addEventListener(\"load\", complete, false)\n xhr.addEventListener(\"error\", failed, false)\n\n xhr.open(\"POST\", $urls.resolve(\"importer\"))\n xhr.setRequestHeader(\"Authorization\", \"Bearer #{$auth.getToken()}\")\n xhr.setRequestHeader('Accept', 'application/json')\n xhr.send(data)\n\n return defered.promise\n\n return (instance) ->\n instance.projects = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgProjectsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgAuth\",\n \"$q\", \"$translate\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/memberships.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (id) ->\n return $repo.queryOne(\"roles\", id)\n\n service.list = (projectId) ->\n return $repo.queryMany(\"roles\", {project: projectId})\n\n return (instance) ->\n instance.roles = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgRolesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/search.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $urls, $http) ->\n service = {}\n\n service.do = (projectId, term) ->\n url = $urls.resolve(\"search\")\n params = {\n project: projectId\n text: term,\n get_all: false\n }\n\n return $http.get(url, params).then (data) ->\n return data.data\n\n return (instance) ->\n instance.search = service\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgSearchResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/sprints.coffee\n###\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($repo, $model, $storage) ->\n service = {}\n\n service.get = (projectId, sprintId) ->\n return $repo.queryOne(\"milestones\", sprintId).then (sprint) ->\n uses = sprint.user_stories\n uses = _.map(uses, (u) -> $model.make_model(\"userstories\", u))\n sprint._attrs.user_stories = uses\n return sprint\n\n service.stats = (projectId, sprintId) ->\n return $repo.queryOneRaw(\"milestones\", \"#{sprintId}/stats\")\n\n service.list = (projectId, filters) ->\n params = {\"project\": projectId}\n params = _.extend({}, params, filters or {})\n return $repo.queryMany(\"milestones\", params, {}, true).then (result) =>\n milestones = result[0]\n headers = result[1]\n\n for m in milestones\n uses = m.user_stories\n uses = _.map(uses, (u) => $model.make_model(\"userstories\", u))\n m._attrs.user_stories = uses\n\n return {\n milestones: milestones,\n closed: parseInt(headers(\"Taiga-Info-Total-Closed-Milestones\"), 10),\n open: parseInt(headers(\"Taiga-Info-Total-Opened-Milestones\"), 10)\n }\n\n\n return (instance) ->\n instance.sprints = service\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgSprintsResourcesProvider\", [\"$tgRepo\", \"$tgModel\", \"$tgStorage\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/tasks.coffee\n###\n\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($repo, $http, $urls, $storage) ->\n service = {}\n hashSuffix = \"tasks-queryparams\"\n hashSuffixStatusColumnModes = \"tasks-statuscolumnmodels\"\n hashSuffixUsRowModes = \"tasks-usrowmodels\"\n\n service.get = (projectId, taskId) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n return $repo.queryOne(\"tasks\", taskId, params)\n\n service.getByRef = (projectId, ref) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n params.ref = ref\n return $repo.queryOne(\"tasks\", \"by_ref\", params)\n\n service.listInAllProjects = (filters) ->\n return $repo.queryMany(\"tasks\", filters)\n\n service.list = (projectId, sprintId=null, userStoryId=null) ->\n params = {project: projectId}\n params.milestone = sprintId if sprintId\n params.user_story = userStoryId if userStoryId\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(\"tasks\", params)\n\n service.bulkCreate = (projectId, sprintId, usId, data) ->\n url = $urls.resolve(\"bulk-create-tasks\")\n params = {project_id: projectId, sprint_id: sprintId, us_id: usId, bulk_tasks: data}\n return $http.post(url, params).then (result) ->\n return result.data\n\n service.upvote = (taskId) ->\n url = $urls.resolve(\"task-upvote\", taskId)\n return $http.post(url)\n\n service.downvote = (taskId) ->\n url = $urls.resolve(\"task-downvote\", taskId)\n return $http.post(url)\n\n service.watch = (taskId) ->\n url = $urls.resolve(\"task-watch\", taskId)\n return $http.post(url)\n\n service.unwatch = (taskId) ->\n url = $urls.resolve(\"task-unwatch\", taskId)\n return $http.post(url)\n\n service.bulkUpdateTaskTaskboardOrder = (projectId, data) ->\n url = $urls.resolve(\"bulk-update-task-taskboard-order\")\n params = {project_id: projectId, bulk_tasks: data}\n return $http.post(url, params)\n\n service.listValues = (projectId, type) ->\n params = {\"project\": projectId}\n return $repo.queryMany(type, params)\n\n service.storeQueryParams = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getQueryParams = (projectId) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeStatusColumnModes = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffixStatusColumnModes}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getStatusColumnModes = (projectId) ->\n ns = \"#{projectId}:#{hashSuffixStatusColumnModes}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeUsRowModes = (projectId, sprintId, params) ->\n ns = \"#{projectId}:#{hashSuffixUsRowModes}\"\n hash = generateHash([projectId, sprintId, ns])\n\n $storage.set(hash, params)\n\n service.getUsRowModes = (projectId, sprintId) ->\n ns = \"#{projectId}:#{hashSuffixUsRowModes}\"\n hash = generateHash([projectId, sprintId, ns])\n\n return $storage.get(hash) or {}\n\n return (instance) ->\n instance.tasks = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgTasksResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/memberships.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($config, $repo, $http, $urls, $q) ->\n service = {}\n\n service.changeAvatar = (file) ->\n maxFileSize = $config.get(\"maxUploadFileSize\", null)\n if maxFileSize and file.size > maxFileSize\n response = {\n status: 413,\n data: _error_message: \"'#{file.name}' (#{sizeFormat(file.size)}) is too heavy for our oompa\n loompas, try it with a smaller than (#{sizeFormat(maxFileSize)})\"\n }\n defered = $q.defer()\n defered.reject(response)\n return defered.promise\n\n data = new FormData()\n data.append('avatar', file)\n options = {\n transformRequest: angular.identity,\n headers: {'Content-Type': undefined}\n }\n url = \"#{$urls.resolve(\"users\")}/change_avatar\"\n return $http.post(url, data, {}, options)\n\n service.removeAvatar = () ->\n url = \"#{$urls.resolve(\"users\")}/remove_avatar\"\n return $http.post(url)\n\n service.changePassword = (currentPassword, newPassword) ->\n url = \"#{$urls.resolve(\"users\")}/change_password\"\n data = {\n current_password: currentPassword\n password: newPassword\n }\n return $http.post(url, data)\n\n return (instance) ->\n instance.userSettings = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgUserSettingsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$q\",\n resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/user.coffee\n###\n\n\ntaiga = @.taiga\nsizeFormat = @.taiga.sizeFormat\n\n\nresourceProvider = ($http, $urls) ->\n service = {}\n\n service.contacts = (userId, options={}) ->\n url = $urls.resolve(\"user-contacts\", userId)\n httpOptions = {headers: {}}\n\n if not options.enablePagination\n httpOptions.headers[\"x-disable-pagination\"] = \"1\"\n\n return $http.get(url, {}, httpOptions)\n .then (result) ->\n return result.data\n\n return (instance) ->\n instance.users = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgUsersResourcesProvider\", [\"$tgHttp\", \"$tgUrls\", \"$q\",\n resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/userstories.coffee\n###\n\ntaiga = @.taiga\n\ngenerateHash = taiga.generateHash\n\nresourceProvider = ($repo, $http, $urls, $storage) ->\n service = {}\n hashSuffix = \"userstories-queryparams\"\n\n service.get = (projectId, usId) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n return $repo.queryOne(\"userstories\", usId, params)\n\n service.getByRef = (projectId, ref) ->\n params = service.getQueryParams(projectId)\n params.project = projectId\n params.ref = ref\n return $repo.queryOne(\"userstories\", \"by_ref\", params)\n\n service.listInAllProjects = (filters) ->\n return $repo.queryMany(\"userstories\", filters)\n\n service.filtersData = (params) ->\n return $repo.queryOneRaw(\"userstories-filters\", null, params)\n\n service.listUnassigned = (projectId, filters) ->\n params = {\"project\": projectId, \"milestone\": \"null\"}\n params = _.extend({}, params, filters or {})\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(\"userstories\", params)\n\n service.listAll = (projectId, filters) ->\n params = {\"project\": projectId}\n params = _.extend({}, params, filters or {})\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(\"userstories\", params)\n\n service.bulkCreate = (projectId, status, bulk) ->\n data = {\n project_id: projectId\n status_id: status\n bulk_stories: bulk\n }\n\n url = $urls.resolve(\"bulk-create-us\")\n\n return $http.post(url, data)\n\n service.upvote = (userStoryId) ->\n url = $urls.resolve(\"userstory-upvote\", userStoryId)\n return $http.post(url)\n\n service.downvote = (userStoryId) ->\n url = $urls.resolve(\"userstory-downvote\", userStoryId)\n return $http.post(url)\n\n service.watch = (userStoryId) ->\n url = $urls.resolve(\"userstory-watch\", userStoryId)\n return $http.post(url)\n\n service.unwatch = (userStoryId) ->\n url = $urls.resolve(\"userstory-unwatch\", userStoryId)\n return $http.post(url)\n\n service.bulkUpdateBacklogOrder = (projectId, data) ->\n url = $urls.resolve(\"bulk-update-us-backlog-order\")\n params = {project_id: projectId, bulk_stories: data}\n return $http.post(url, params)\n\n service.bulkUpdateSprintOrder = (projectId, data) ->\n url = $urls.resolve(\"bulk-update-us-sprint-order\")\n params = {project_id: projectId, bulk_stories: data}\n return $http.post(url, params)\n\n service.bulkUpdateKanbanOrder = (projectId, data) ->\n url = $urls.resolve(\"bulk-update-us-kanban-order\")\n params = {project_id: projectId, bulk_stories: data}\n return $http.post(url, params)\n\n service.listValues = (projectId, type) ->\n params = {\"project\": projectId}\n service.storeQueryParams(projectId, params)\n return $repo.queryMany(type, params)\n\n service.storeQueryParams = (projectId, params) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n $storage.set(hash, params)\n\n service.getQueryParams = (projectId) ->\n ns = \"#{projectId}:#{hashSuffix}\"\n hash = generateHash([projectId, ns])\n return $storage.get(hash) or {}\n\n service.storeShowTags = (projectId, showTags) ->\n hash = generateHash([projectId, 'showTags'])\n $storage.set(hash, showTags)\n\n service.getShowTags = (projectId) ->\n hash = generateHash([projectId, 'showTags'])\n return $storage.get(hash) or null\n\n return (instance) ->\n instance.userstories = service\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgUserstoriesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: webhooklogs.coffee\n###\n\nresourceProvider = ($repo, $urls, $http) ->\n service = {}\n\n service.list = (webhookId) ->\n params = {webhook: webhookId}\n return $repo.queryMany(\"webhooklogs\", params)\n\n service.resend = (webhooklogId) ->\n url = $urls.resolve(\"webhooklogs-resend\", webhooklogId)\n return $http.post(url)\n\n return (instance) ->\n instance.webhooklogs = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgWebhookLogsResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: webhooks.coffee\n###\n\nresourceProvider = ($repo, $urls, $http) ->\n service = {}\n\n service.list = (projectId) ->\n params = {project: projectId}\n return $repo.queryMany(\"webhooks\", params)\n\n service.test = (webhookId) ->\n url = $urls.resolve(\"webhooks-test\", webhookId)\n return $http.post(url)\n\n return (instance) ->\n instance.webhooks = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgWebhooksResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/resources/wikis.coffee\n###\n\n\ntaiga = @.taiga\n\nresourceProvider = ($repo, $http, $urls) ->\n service = {}\n\n service.get = (wikiId) ->\n return $repo.queryOne(\"wiki\", wikiId)\n\n service.getBySlug = (projectId, slug) ->\n return $repo.queryOne(\"wiki\", \"by_slug?project=#{projectId}&slug=#{slug}\")\n\n service.listLinks = (projectId) ->\n return $repo.queryMany(\"wiki-links\", {project: projectId})\n\n return (instance) ->\n instance.wiki = service\n\n\nmodule = angular.module(\"taigaResources\")\nmodule.factory(\"$tgWikiResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings/main.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaUserSettings\")\n\n\n#############################################################################\n## User ChangePassword Controller\n#############################################################################\n\nclass UserChangePasswordController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"$tgAuth\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @auth, @translate) ->\n @scope.sectionName = @translate.instant(\"CHANGE_PASSWORD.SECTION_NAME\")\n @scope.user = @auth.getUser()\n\nmodule.controller(\"UserChangePasswordController\", UserChangePasswordController)\n\n\n#############################################################################\n## User ChangePassword Directive\n#############################################################################\n\nUserChangePasswordDirective = ($rs, $confirm, $loading, $translate) ->\n link = ($scope, $el, $attrs, ctrl) ->\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n if $scope.newPassword1 != $scope.newPassword2\n $confirm.notify('error', $translate.instant(\"CHANGE_PASSWORD.ERROR_PASSWORD_MATCH\"))\n return\n\n currentLoading = $loading()\n .target(submitButton)\n .start()\n\n promise = $rs.userSettings.changePassword($scope.currentPassword, $scope.newPassword1)\n promise.then =>\n currentLoading.finish()\n $confirm.notify('success')\n\n promise.then null, (response) =>\n currentLoading.finish()\n $confirm.notify('error', response.data._error_message)\n\n submitButton = $el.find(\".submit-button\")\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {\n link:link\n }\n\nmodule.directive(\"tgUserChangePassword\", [\"$tgResources\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", UserChangePasswordDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/issues/lightboxes.coffee\n###\n\ntaiga = @.taiga\nbindOnce = @.taiga.bindOnce\ndebounce = @.taiga.debounce\n\nmodule = angular.module(\"taigaUserSettings\")\n\n\n#############################################################################\n## Delete User Lightbox Directive\n#############################################################################\n\nDeleteUserDirective = ($repo, $rootscope, $auth, $location, $navUrls, lightboxService) ->\n link = ($scope, $el, $attrs) ->\n $scope.$on \"deletelightbox:new\", (ctx, user)->\n lightboxService.open($el)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n submit = ->\n promise = $repo.remove($scope.user)\n\n promise.then (data) ->\n lightboxService.close($el)\n $auth.logout()\n $location.path($navUrls.resolve(\"login\"))\n\n # FIXME: error handling?\n promise.then null, ->\n console.log \"FAIL\"\n\n $el.on \"click\", \".button-red\", (event) ->\n event.preventDefault()\n lightboxService.close($el)\n\n $el.on \"click\", \".button-green\", debounce 2000, (event) ->\n event.preventDefault()\n submit()\n\n return {\n link: link,\n templateUrl: \"user/lightbox/lightbox-delete-account.html\"\n }\n\nmodule.directive(\"tgLbDeleteUser\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\",\n \"lightboxService\", DeleteUserDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings/main.coffee\n###\n\ntaiga = @.taiga\nmixOf = @.taiga.mixOf\nsizeFormat = @.taiga.sizeFormat\nmodule = angular.module(\"taigaUserSettings\")\ndebounce = @.taiga.debounce\n\n#############################################################################\n## User settings Controller\n#############################################################################\n\nclass UserSettingsController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgConfig\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"$tgAuth\",\n \"$translate\"\n ]\n\n constructor: (@scope, @rootscope, @config, @repo, @confirm, @rs, @params, @q, @location, @navUrls,\n @auth, @translate) ->\n @scope.sectionName = \"USER_SETTINGS.MENU.SECTION_TITLE\"\n\n @scope.project = {}\n @scope.user = @auth.getUser()\n\n if !@scope.user\n @location.path(@navUrls.resolve(\"permission-denied\"))\n @location.replace()\n\n @scope.lang = @getLan()\n @scope.theme = @getTheme()\n\n maxFileSize = @config.get(\"maxUploadFileSize\", null)\n if maxFileSize\n text = @translate.instant(\"USER_SETTINGS.AVATAR_MAX_SIZE\", {\"maxFileSize\": sizeFormat(maxFileSize)})\n @scope.maxFileSizeMsg = text\n\n promise = @.loadInitialData()\n\n promise.then null, @.onInitialDataError.bind(@)\n\n loadInitialData: ->\n @scope.availableThemes = @config.get(\"themes\", [])\n\n return @rs.locales.list().then (locales) =>\n @scope.locales = locales\n return locales\n\n openDeleteLightbox: ->\n @rootscope.$broadcast(\"deletelightbox:new\", @scope.user)\n\n getLan: ->\n return @scope.user.lang ||\n @translate.preferredLanguage()\n\n getTheme: ->\n return @scope.user.theme ||\n @config.get(\"defaultTheme\") ||\n \"taiga\"\n\nmodule.controller(\"UserSettingsController\", UserSettingsController)\n\n\n#############################################################################\n## User Profile Directive\n#############################################################################\n\nUserProfileDirective = ($confirm, $auth, $repo, $translate) ->\n link = ($scope, $el, $attrs) ->\n submit = debounce 2000, (event) =>\n event.preventDefault()\n\n form = $el.find(\"form\").checksley()\n return if not form.validate()\n\n changeEmail = $scope.user.isAttributeModified(\"email\")\n $scope.user.lang = $scope.lang\n $scope.user.theme = $scope.theme\n\n onSuccess = (data) =>\n $auth.setUser(data)\n\n if changeEmail\n text = $translate.instant(\"USER_PROFILE.CHANGE_EMAIL_SUCCESS\")\n $confirm.success(text)\n else\n $confirm.notify('success')\n\n onError = (data) =>\n form.setErrors(data)\n $confirm.notify('error', data._error_message)\n\n $repo.save($scope.user).then(onSuccess, onError)\n\n $el.on \"submit\", \"form\", submit\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgUserProfile\", [\"$tgConfirm\", \"$tgAuth\", \"$tgRepo\", \"$translate\", UserProfileDirective])\n\n\n#############################################################################\n## User Avatar Directive\n#############################################################################\n\nUserAvatarDirective = ($auth, $model, $rs, $confirm) ->\n link = ($scope, $el, $attrs) ->\n showSizeInfo = ->\n $el.find(\".size-info\").removeClass(\"hidden\")\n\n onSuccess = (response) ->\n user = $model.make_model(\"users\", response.data)\n $auth.setUser(user)\n $scope.user = user\n\n $el.find('.overlay').addClass('hidden')\n $confirm.notify('success')\n\n onError = (response) ->\n showSizeInfo() if response.status == 413\n $el.find('.overlay').addClass('hidden')\n $confirm.notify('error', response.data._error_message)\n\n # Change photo\n $el.on \"click\", \".js-change-avatar\", ->\n $el.find(\"#avatar-field\").click()\n\n $el.on \"change\", \"#avatar-field\", (event) ->\n if $scope.avatarAttachment\n $el.find('.overlay').removeClass('hidden')\n $rs.userSettings.changeAvatar($scope.avatarAttachment).then(onSuccess, onError)\n\n # Use gravatar photo\n $el.on \"click\", \"a.use-gravatar\", (event) ->\n $el.find('.overlay').removeClass('hidden')\n $rs.userSettings.removeAvatar().then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgUserAvatar\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", UserAvatarDirective])\n\n\n#############################################################################\n## User Avatar Model Directive\n#############################################################################\n\nTaigaAvatarModelDirective = ($parse) ->\n link = ($scope, $el, $attrs) ->\n model = $parse($attrs.tgAvatarModel)\n modelSetter = model.assign\n\n $el.bind 'change', ->\n $scope.$apply ->\n modelSetter($scope, $el[0].files[0])\n\n return {link:link}\n\nmodule.directive('tgAvatarModel', ['$parse', TaigaAvatarModelDirective])\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings/nav.coffee\n###\n\nUserSettingsNavigationDirective = ->\n link = ($scope, $el, $attrs) ->\n section = $attrs.tgUserSettingsNavigation\n $el.find(\".active\").removeClass(\"active\")\n $el.find(\"#usersettingsmenu-#{section} a\").addClass(\"active\")\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule = angular.module(\"taigaUserSettings\")\nmodule.directive(\"tgUserSettingsNavigation\", UserSettingsNavigationDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/user-settings/notifications.coffee\n###\n\ntaiga = @.taiga\nmixOf = @.taiga.mixOf\nbindOnce = @.taiga.bindOnce\n\nmodule = angular.module(\"taigaUserSettings\")\n\n\n#############################################################################\n## User settings Controller\n#############################################################################\n\nclass UserNotificationsController extends mixOf(taiga.Controller, taiga.PageMixin)\n @.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$tgRepo\",\n \"$tgConfirm\",\n \"$tgResources\",\n \"$routeParams\",\n \"$q\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"$tgAuth\"\n ]\n\n constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @auth) ->\n @scope.sectionName = \"USER_SETTINGS.NOTIFICATIONS.SECTION_NAME\"\n @scope.user = @auth.getUser()\n promise = @.loadInitialData()\n promise.then null, @.onInitialDataError.bind(@)\n\n loadInitialData: ->\n return @rs.notifyPolicies.list().then (notifyPolicies) =>\n @scope.notifyPolicies = notifyPolicies\n return notifyPolicies\n\nmodule.controller(\"UserNotificationsController\", UserNotificationsController)\n\n\n#############################################################################\n## User Notifications Directive\n#############################################################################\n\nUserNotificationsDirective = () ->\n link = ($scope, $el, $attrs) ->\n $scope.$on \"$destroy\", ->\n $el.off()\n\n return {link:link}\n\nmodule.directive(\"tgUserNotifications\", UserNotificationsDirective)\n\n\n#############################################################################\n## User Notifications List Directive\n#############################################################################\n\nUserNotificationsListDirective = ($repo, $confirm, $compile) ->\n template = _.template(\"\"\"\n <% _.each(notifyPolicies, function (notifyPolicy, index) { %>\n
\">\n
<%- notifyPolicy.project_name %>
\n
\n
\n \" id=\"policy-all-<%- notifyPolicy.id %>\"\n value=\"2\" <% if (notifyPolicy.notify_level == 2) { %>checked=\"checked\"<% } %>/>\n \n
\n
\n
\n
\n \" id=\"policy-involved-<%- notifyPolicy.id %>\"\n value=\"1\" <% if (notifyPolicy.notify_level == 1) { %>checked=\"checked\"<% } %> />\n \n
\n
\n
\n
\n \" id=\"policy-none-<%- notifyPolicy.id %>\"\n value=\"3\" <% if (notifyPolicy.notify_level == 3) { %>checked=\"checked\"<% } %> />\n \n
\n
\n
\n <% }) %>\n \"\"\")\n\n link = ($scope, $el, $attrs) ->\n render = ->\n $el.off()\n\n ctx = {notifyPolicies: $scope.notifyPolicies}\n html = template(ctx)\n\n $el.html($compile(html)($scope))\n\n $el.on \"change\", \"input[type=radio]\", (event) ->\n target = angular.element(event.currentTarget)\n\n policyIndex = target.parents(\".policy-table-row\").data('index')\n policy = $scope.notifyPolicies[policyIndex]\n prev_level = policy.notify_level\n policy.notify_level = parseInt(target.val(), 10)\n\n onSuccess = ->\n $confirm.notify(\"success\")\n\n onError = ->\n $confirm.notify(\"error\")\n target.parents(\".policy-table-row\")\n .find(\"input[value=#{prev_level}]\")\n .prop(\"checked\", true)\n\n $repo.save(policy).then(onSuccess, onError)\n\n $scope.$on \"$destroy\", ->\n $el.off()\n\n bindOnce($scope, $attrs.ngModel, render)\n\n return {link:link}\n\nmodule.directive(\"tgUserNotificationsList\", [\"$tgRepo\", \"$tgConfirm\", \"$compile\",\n UserNotificationsListDirective])\n","###\n# Copyright (C) 2015 Taiga Agile LLC\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: components.module.coffee\n###\n\nangular.module(\"taigaComponents\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: external-apps.module.coffee\n###\n\nmodule = angular.module(\"taigaExternalApps\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: home.module.coffee\n###\n\nmodule = angular.module(\"taigaHome\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: navigation-bar.module.coffee\n###\n\nangular.module(\"taigaNavigationBar\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile.module.coffee\n###\n\nmodule = angular.module(\"taigaProfile\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: projects.module.coffee\n###\n\nangular.module(\"taigaProjects\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: resources.module.coffee\n###\n\nangular.module(\"taigaResources2\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline.module.coffee\n###\n\nangular.module(\"taigaUserTimeline\", [])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: joy-ride.directive.coffee\n###\n\ntaiga = @.taiga\n\nJoyRideDirective = ($rootScope, currentUserService, joyRideService, $location) ->\n link = (scope, el, attrs, ctrl) ->\n unsuscribe = null\n intro = introJs()\n\n #Todo: translate\n intro.setOptions({\n exitOnEsc: false,\n exitOnOverlayClick: false,\n showStepNumbers: false,\n nextLabel: 'Next →',\n prevLabel: '← Back',\n skipLabel: 'Skip',\n doneLabel: 'Done',\n disableInteraction: true\n })\n\n intro.oncomplete () ->\n $('html,body').scrollTop(0)\n\n intro.onexit () ->\n currentUserService.disableJoyRide()\n\n initJoyrRide = (next, config) ->\n if !config[next.joyride]\n return\n\n intro.setOption('steps', joyRideService.get(next.joyride))\n intro.start()\n\n $rootScope.$on '$routeChangeSuccess', (event, next) ->\n if !next.joyride || !currentUserService.isAuthenticated()\n intro.exit()\n unsuscribe() if unsuscribe\n return\n\n\n intro.oncomplete () ->\n currentUserService.disableJoyRide(next.joyride)\n\n if next.loader\n unsuscribe = $rootScope.$on 'loader:end', () ->\n currentUserService.loadJoyRideConfig()\n .then (config) -> initJoyrRide(next, config)\n\n unsuscribe()\n else\n currentUserService.loadJoyRideConfig()\n .then (config) -> initJoyrRide(next, config)\n\n return {\n scope: {},\n link: link\n }\n\nJoyRideDirective.$inject = [\n \"$rootScope\",\n \"tgCurrentUserService\",\n \"tgJoyRideService\",\n \"$location\"\n]\n\nangular.module(\"taigaComponents\").directive(\"tgJoyRide\", JoyRideDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: joy-ride.service.coffee\n###\n\nclass JoyRideService extends taiga.Service\n @.$inject = [\n '$translate',\n 'tgCheckPermissionsService'\n ]\n\n constructor: (@translate, @checkPermissionsService) ->\n\n getConfig: () ->\n return {\n dashboard: () =>\n steps = [\n {\n element: '.project-list > section:not(.ng-hide)',\n position: 'left',\n joyride: {\n title: @translate.instant('JOYRIDE.DASHBOARD.STEP1.TITLE'),\n text: @translate.instant('JOYRIDE.DASHBOARD.STEP1.TEXT')\n }\n },\n {\n element: '.working-on-container',\n position: 'right',\n joyride: {\n title: @translate.instant('JOYRIDE.DASHBOARD.STEP2.TITLE'),\n text: @translate.instant('JOYRIDE.DASHBOARD.STEP2.TEXT')\n }\n },\n {\n element: '.watching-container',\n position: 'right',\n joyride: {\n title: @translate.instant('JOYRIDE.DASHBOARD.STEP3.TITLE')\n text: [\n @translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT1'),\n @translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT2')\n ]\n }\n }\n ]\n\n if !$('.project-list .create-project-button').is(':hidden')\n steps.push({\n element: '.project-list .create-project-button',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.DASHBOARD.STEP4.TITLE')\n text: [\n @translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT1'),\n @translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT2')\n ]\n }\n })\n\n return steps\n\n backlog: () =>\n steps = [\n {\n element: '.summary',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.BACKLOG.STEP1.TITLE')\n text: [\n @translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT1'),\n @translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT2')\n ]\n }\n },\n {\n element: '.backlog-table-empty',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.BACKLOG.STEP2.TITLE')\n text: @translate.instant('JOYRIDE.BACKLOG.STEP2.TEXT')\n }\n },\n {\n element: '.sprints',\n position: 'left',\n joyride: {\n title: @translate.instant('JOYRIDE.BACKLOG.STEP3.TITLE')\n text: @translate.instant('JOYRIDE.BACKLOG.STEP3.TEXT')\n }\n }\n ]\n\n if @checkPermissionsService.check('add_us')\n steps.push({\n element: '.new-us',\n position: 'rigth',\n joyride: {\n title: @translate.instant('JOYRIDE.BACKLOG.STEP4.TITLE')\n text: @translate.instant('JOYRIDE.BACKLOG.STEP4.TEXT')\n }\n })\n\n return steps\n\n kanban: () =>\n steps = [\n {\n element: '.kanban-table-inner',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.KANBAN.STEP1.TITLE')\n text: @translate.instant('JOYRIDE.KANBAN.STEP1.TEXT')\n }\n },\n {\n element: '.card-placeholder',\n position: 'right',\n joyride: {\n title: @translate.instant('JOYRIDE.KANBAN.STEP2.TITLE')\n text: @translate.instant('JOYRIDE.KANBAN.STEP2.TEXT')\n }\n }\n ]\n\n if @checkPermissionsService.check('add_us')\n steps.push({\n element: '.icon-plus',\n position: 'bottom',\n joyride: {\n title: @translate.instant('JOYRIDE.KANBAN.STEP3.TITLE')\n text: [\n @translate.instant('JOYRIDE.KANBAN.STEP3.TEXT1'),\n @translate.instant('JOYRIDE.KANBAN.STEP3.TEXT2'),\n ]\n }\n })\n\n return steps\n }\n\n get: (name) ->\n joyRides = @.getConfig()\n joyRide = joyRides[name].call(this)\n\n return _.map joyRide, (item) ->\n html = \"\"\n\n if item.joyride.title\n html += \"

#{item.joyride.title}

\"\n\n if _.isArray(item.joyride.text)\n _.forEach item.joyride.text, (text) ->\n html += \"

#{text}

\"\n else\n html += \"

#{item.joyride.text}

\"\n\n item.intro = html\n\n return item\n\nangular.module(\"taigaComponents\").service(\"tgJoyRideService\", JoyRideService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: project-menu.controller.coffee\n###\n\nclass ProjectMenuController\n @.$inject = [\n \"tgProjectService\",\n \"tgLightboxFactory\"\n ]\n\n constructor: (@projectService, @lightboxFactory) ->\n @.project = null\n @.menu = Immutable.Map()\n\n show: () ->\n @.project = @projectService.project\n\n @.active = @._getActiveSection()\n\n @._setVideoConference()\n @._setMenuPermissions()\n\n hide: () ->\n @.project = null\n @.menu = {}\n\n search: () ->\n @lightboxFactory.create(\"tg-search-box\", {\n \"class\": \"lightbox lightbox-search\"\n })\n\n _setVideoConference: () ->\n videoconferenceUrl = @._videoConferenceUrl()\n\n if videoconferenceUrl\n @.project = @.project.set(\"videoconferenceUrl\", videoconferenceUrl)\n\n _setMenuPermissions: () ->\n @.menu = Immutable.Map({\n backlog: false,\n kanban: false,\n issues: false,\n wiki: false\n })\n\n if @.project.get(\"is_backlog_activated\") && @.project.get(\"my_permissions\").indexOf(\"view_us\") != -1\n @.menu = @.menu.set(\"backlog\", true)\n\n if @.project.get(\"is_kanban_activated\") && @.project.get(\"my_permissions\").indexOf(\"view_us\") != -1\n @.menu = @.menu.set(\"kanban\", true)\n\n if @.project.get(\"is_issues_activated\") && @.project.get(\"my_permissions\").indexOf(\"view_issues\") != -1\n @.menu = @.menu.set(\"issues\", true)\n\n if @.project.get(\"is_wiki_activated\") && @.project.get(\"my_permissions\").indexOf(\"view_wiki_pages\") != -1\n @.menu = @.menu.set(\"wiki\", true)\n\n _getActiveSection: () ->\n sectionName = @projectService.section\n sectionsBreadcrumb = @projectService.sectionsBreadcrumb\n\n indexBacklog = sectionsBreadcrumb.lastIndexOf(\"backlog\")\n indexKanban = sectionsBreadcrumb.lastIndexOf(\"kanban\")\n\n if indexBacklog != -1 || indexKanban != -1\n if indexKanban == -1 || indexBacklog < indexKanban\n oldSectionName = \"backlog\"\n else\n oldSectionName = \"kanban\"\n\n if sectionName == \"backlog-kanban\"\n if oldSectionName in [\"backlog\", \"kanban\"]\n sectionName = oldSectionName\n else if @.project.get(\"is_backlog_activated\") && !@.project.get(\"is_kanban_activated\")\n sectionName = \"backlog\"\n else if !@.project.get(\"is_backlog_activated\") && @.project.get(\"is_kanban_activated\")\n sectionName = \"kanban\"\n\n return sectionName\n\n _videoConferenceUrl: () ->\n if @.project.get(\"videoconferences\") == \"appear-in\"\n baseUrl = \"https://appear.in/\"\n else if @.project.get(\"videoconferences\") == \"talky\"\n baseUrl = \"https://talky.io/\"\n else if @.project.get(\"videoconferences\") == \"jitsi\"\n baseUrl = \"https://meet.jit.si/\"\n url = @.project.get(\"slug\") + \"-\" + taiga.slugify(@.project.get(\"videoconferences_extra_data\"))\n url = url.replace(/-/g, \"\")\n return baseUrl + url\n else if @.project.get(\"videoconferences\") == \"custom\"\n return @.project.get(\"videoconferences_extra_data\")\n else\n return \"\"\n\n if @.project.get(\"videoconferences_extra_data\")\n url = @.project.get(\"slug\") + \"-\" + @.project.get(\"videoconferences_extra_data\")\n else\n url = @.project.get(\"slug\")\n\n return baseUrl + url\n\nangular.module(\"taigaComponents\").controller(\"ProjectMenu\", ProjectMenuController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: project-menu.directive.coffee\n###\n\ntaiga = @.taiga\n\nProjectMenuDirective = (projectService, lightboxFactory) ->\n link = (scope, el, attrs, ctrl) ->\n projectChange = () ->\n if projectService.project\n ctrl.show()\n else\n ctrl.hide()\n\n scope.$watch ( () ->\n return projectService.project\n ), projectChange\n\n return {\n scope: {},\n controller: \"ProjectMenu\",\n controllerAs: \"vm\",\n templateUrl: \"components/project-menu/project-menu.html\",\n link: link\n }\n\nProjectMenuDirective.$inject = [\n \"tgProjectService\",\n \"tgLightboxFactory\"\n]\n\nangular.module(\"taigaComponents\").directive(\"tgProjectMenu\", ProjectMenuDirective)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.directive.coffee\n###\n\n\nTermsOfServiceAndPrivacyPolicyNoticeDirective = ($config) ->\n link = (scope, el, attrs) ->\n scope.privacyPolicyUrl = $config.get(\"privacyPolicyUrl\")\n scope.termsOfServiceUrl = $config.get(\"termsOfServiceUrl\")\n\n return {\n restrict: \"AE\",\n scope: {},\n link: link,\n templateUrl: \"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html\"\n }\n\nangular.module(\"taigaComponents\")\n .directive(\"tgTermsOfServiceAndPrivacyPolicyNotice\", [\n \"$tgConfig\",\n TermsOfServiceAndPrivacyPolicyNoticeDirective\n ])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: vote-button.controller.coffee\n###\n\nclass VoteButtonController\n @.$inject = [\n \"tgCurrentUserService\",\n ]\n\n constructor: (@currentUserService) ->\n @.user = @currentUserService.getUser()\n @.isMouseOver = false\n @.loading = false\n\n showTextWhenMouseIsOver: ->\n @.isMouseOver = true\n\n showTextWhenMouseIsLeave: ->\n @.isMouseOver = false\n\n toggleVote: ->\n @.loading = true\n\n if not @.item.is_voter\n promise = @._upvote()\n else\n promise = @._downvote()\n\n promise.finally () => @.loading = false\n\n return promise\n\n _upvote: ->\n @.onUpvote().then =>\n @.showTextWhenMouseIsLeave()\n\n _downvote: ->\n @.onDownvote()\n\nangular.module(\"taigaComponents\").controller(\"VoteButton\", VoteButtonController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: vote-button.directive.coffee\n###\n\nVoteButtonDirective = ->\n return {\n scope: {}\n controller: \"VoteButton\",\n bindToController: {\n item: \"=\",\n onUpvote: \"=\",\n onDownvote: \"=\"\n }\n controllerAs: \"vm\",\n templateUrl: \"components/vote-button/vote-button.html\",\n }\n\nangular.module(\"taigaComponents\").directive(\"tgVoteButton\", VoteButtonDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-button.controller.coffee\n###\n\nclass WatchButtonController\n @.$inject = [\n \"tgCurrentUserService\",\n ]\n\n constructor: (@currentUserService) ->\n @.user = @currentUserService.getUser()\n @.isMouseOver = false\n @.loading = false\n\n showTextWhenMouseIsOver: ->\n @.isMouseOver = true\n\n showTextWhenMouseIsLeave: ->\n @.isMouseOver = false\n\n toggleWatch: ->\n @.loading = true\n\n if not @.item.is_watcher\n promise = @._watch()\n else\n promise = @._unwatch()\n\n promise.finally () => @.loading = false\n\n return promise\n\n _watch: ->\n @.onWatch().then =>\n @.showTextWhenMouseIsLeave()\n\n _unwatch: ->\n @.onUnwatch()\n\nangular.module(\"taigaComponents\").controller(\"WatchButton\", WatchButtonController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-button.directive.coffee\n###\n\nWatchButtonDirective = ->\n return {\n scope: {}\n controller: \"WatchButton\",\n bindToController: {\n item: \"=\",\n onWatch: \"=\",\n onUnwatch: \"=\"\n }\n controllerAs: \"vm\",\n templateUrl: \"components/watch-button/watch-button.html\",\n }\n\nangular.module(\"taigaComponents\").directive(\"tgWatchButton\", WatchButtonDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: external-app.controller.coffee\n###\n\ntaiga = @.taiga\n\nclass ExternalAppController extends taiga.Controller\n @.$inject = [\n \"$routeParams\",\n \"tgExternalAppsService\",\n \"$window\",\n \"tgCurrentUserService\",\n \"$location\",\n \"$tgNavUrls\",\n \"tgXhrErrorService\",\n \"tgLoader\"\n ]\n\n constructor: (@routeParams, @externalAppsService, @window, @currentUserService, @location,\n @navUrls, @xhrError, @loader) ->\n @loader.start(false)\n @._applicationId = @routeParams.application\n @._state = @routeParams.state\n @._getApplicationToken()\n @._user = @currentUserService.getUser()\n @._application = null\n nextUrl = encodeURIComponent(@location.url())\n loginUrl = @navUrls.resolve(\"login\")\n @.loginWithAnotherUserUrl = \"#{loginUrl}?next=#{nextUrl}\"\n\n taiga.defineImmutableProperty @, \"user\", () => @._user\n taiga.defineImmutableProperty @, \"application\", () => @._application\n\n _redirect: (applicationToken) =>\n nextUrl = applicationToken.get(\"next_url\")\n @window.open(nextUrl, \"_self\")\n\n _getApplicationToken: =>\n return @externalAppsService.getApplicationToken(@._applicationId, @._state)\n .then (data) =>\n @._application = data.get(\"application\")\n if data.get(\"auth_code\")\n @._redirect(data)\n else\n @loader.pageLoaded()\n\n .catch (xhr) =>\n @loader.pageLoaded()\n return @xhrError.response(xhr)\n\n cancel: () ->\n @window.history.back()\n\n createApplicationToken: =>\n return @externalAppsService.authorizeApplicationToken(@._applicationId, @._state)\n .then (data) =>\n @._redirect(data)\n .catch (xhr) =>\n return @xhrError.response(xhr)\n\n\nangular.module(\"taigaExternalApps\").controller(\"ExternalApp\", ExternalAppController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: external-app.service.coffee\n###\n\nclass ExternalAppsService extends taiga.Service\n @.$inject = [\n \"tgResources\"\n ]\n\n constructor: (@rs) ->\n\n getApplicationToken: (applicationId, state) ->\n return @rs.externalapps.getApplicationToken(applicationId, state)\n\n authorizeApplicationToken: (applicationId, state) ->\n return @rs.externalapps.authorizeApplicationToken(applicationId, state)\n\nangular.module(\"taigaExternalApps\").service(\"tgExternalAppsService\", ExternalAppsService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: feedback.service.coffee\n###\n\nclass FeedbackService extends taiga.Service\n @.$inject = [\"tgLightboxFactory\"]\n\n constructor: (@lightboxFactory) ->\n\n sendFeedback: ->\n @lightboxFactory.create(\"tg-lb-feedback\", {\n \"class\": \"lightbox lightbox-feedback lightbox-generic-form\"\n })\n\nangular.module(\"taigaFeedback\").service(\"tgFeedbackService\", FeedbackService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: duty.directive.coffee\n###\n\nDutyDirective = (navurls, $translate) ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n scope.vm.duty = scope.duty\n\n scope.vm.getDutyType = () ->\n if scope.vm.duty\n if scope.vm.duty.get('_name') == \"userstories\"\n return $translate.instant(\"COMMON.USER_STORY\")\n if scope.vm.duty.get('_name') == \"tasks\"\n return $translate.instant(\"COMMON.TASK\")\n if scope.vm.duty.get('_name') == \"issues\"\n return $translate.instant(\"COMMON.ISSUE\")\n\n return {\n templateUrl: \"home/duties/duty.html\"\n scope: {\n \"duty\": \"=tgDuty\"\n }\n link: link\n }\n\nDutyDirective.$inject = [\n \"$tgNavUrls\",\n \"$translate\"\n]\n\nangular.module(\"taigaHome\").directive(\"tgDuty\", DutyDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: home.service.coffee\n###\n\ngroupBy = @.taiga.groupBy\n\nclass HomeService extends taiga.Service\n @.$inject = [\n \"$tgNavUrls\",\n \"tgResources\",\n \"tgProjectsService\"\n ]\n\n constructor: (@navurls, @rs, @projectsService) ->\n\n _attachProjectInfoToWorkInProgress: (workInProgress, projectsById) ->\n _attachProjectInfoToDuty = (duty, objType) =>\n project = projectsById.get(String(duty.get('project')))\n\n ctx = {\n project: project.get('slug')\n ref: duty.get('ref')\n }\n\n url = @navurls.resolve(\"project-#{objType}-detail\", ctx)\n\n duty = duty.set('url', url)\n duty = duty.set('projectName', project.get('name'))\n duty = duty.set(\"_name\", objType)\n\n return duty\n\n assignedTo = workInProgress.get(\"assignedTo\")\n\n if assignedTo.get(\"userStories\")\n _duties = assignedTo.get(\"userStories\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"userstories\")\n\n assignedTo = assignedTo.set(\"userStories\", _duties)\n\n if assignedTo.get(\"tasks\")\n _duties = assignedTo.get(\"tasks\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"tasks\")\n\n assignedTo = assignedTo.set(\"tasks\", _duties)\n\n if assignedTo.get(\"issues\")\n _duties = assignedTo.get(\"issues\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"issues\")\n\n assignedTo = assignedTo.set(\"issues\", _duties)\n\n watching = workInProgress.get(\"watching\")\n\n if watching.get(\"userStories\")\n _duties = watching.get(\"userStories\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"userstories\")\n\n watching = watching.set(\"userStories\", _duties)\n\n if watching.get(\"tasks\")\n _duties = watching.get(\"tasks\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"tasks\")\n\n watching = watching.set(\"tasks\", _duties)\n\n if watching.get(\"issues\")\n _duties = watching.get(\"issues\").map (duty) ->\n return _attachProjectInfoToDuty(duty, \"issues\")\n\n watching = watching.set(\"issues\", _duties)\n\n\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo)\n workInProgress = workInProgress.set(\"watching\", watching)\n\n\n getWorkInProgress: (userId) ->\n projectsById = Immutable.Map()\n\n projectsPromise = @projectsService.getProjectsByUserId(userId).then (projects) ->\n projectsById = Immutable.fromJS(groupBy(projects.toJS(), (p) -> p.id))\n\n assignedTo = Immutable.Map()\n\n params = {\n status__is_closed: false\n assigned_to: userId\n }\n\n params_us = {\n is_closed: false\n assigned_to: userId\n }\n\n assignedUserStoriesPromise = @rs.userstories.listInAllProjects(params_us).then (userstories) ->\n assignedTo = assignedTo.set(\"userStories\", userstories)\n\n assignedTasksPromise = @rs.tasks.listInAllProjects(params).then (tasks) ->\n assignedTo = assignedTo.set(\"tasks\", tasks)\n\n assignedIssuesPromise = @rs.issues.listInAllProjects(params).then (issues) ->\n assignedTo = assignedTo.set(\"issues\", issues)\n\n params = {\n status__is_closed: false\n watchers: userId\n }\n\n params_us = {\n is_closed: false\n watchers: userId\n }\n\n watching = Immutable.Map()\n\n watchingUserStoriesPromise = @rs.userstories.listInAllProjects(params_us).then (userstories) ->\n watching = watching.set(\"userStories\", userstories)\n\n watchingTasksPromise = @rs.tasks.listInAllProjects(params).then (tasks) ->\n watching = watching.set(\"tasks\", tasks)\n\n watchingIssuesPromise = @rs.issues.listInAllProjects(params).then (issues) ->\n watching = watching.set(\"issues\", issues)\n\n workInProgress = Immutable.Map()\n\n Promise.all([\n projectsPromise\n assignedUserStoriesPromise,\n assignedTasksPromise,\n assignedIssuesPromise,\n watchingUserStoriesPromise,\n watchingTasksPromise,\n watchingIssuesPromise\n ]).then =>\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo)\n workInProgress = workInProgress.set(\"watching\", watching)\n\n workInProgress = @._attachProjectInfoToWorkInProgress(workInProgress, projectsById)\n\n return workInProgress\n\nangular.module(\"taigaHome\").service(\"tgHomeService\", HomeService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: home-project-list.directive.coffee\n###\n\nHomeProjectListDirective = (currentUserService, projectsService) ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n\n taiga.defineImmutableProperty(scope.vm, \"projects\", () -> currentUserService.projects.get(\"recents\"))\n\n scope.vm.newProject = ->\n projectsService.newProject()\n\n directive = {\n templateUrl: \"home/projects/home-project-list.html\"\n scope: {}\n link: link\n }\n\n return directive\n\nHomeProjectListDirective.$inject = [\n \"tgCurrentUserService\",\n \"tgProjectsService\"\n]\n\nangular.module(\"taigaHome\").directive(\"tgHomeProjectList\", HomeProjectListDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: working-on.controller.coffee\n###\n\nclass WorkingOnController\n @.$inject = [\n \"tgHomeService\"\n ]\n\n constructor: (@homeService) ->\n @.assignedTo = Immutable.Map()\n @.watching = Immutable.Map()\n\n _setAssignedTo: (workInProgress) ->\n userStories = workInProgress.get(\"assignedTo\").get(\"userStories\")\n tasks = workInProgress.get(\"assignedTo\").get(\"tasks\")\n issues = workInProgress.get(\"assignedTo\").get(\"issues\")\n\n @.assignedTo = userStories.concat(tasks).concat(issues)\n if @.assignedTo.size > 0\n @.assignedTo = @.assignedTo.sortBy((elem) -> elem.get(\"modified_date\")).reverse()\n\n _setWatching: (workInProgress) ->\n userStories = workInProgress.get(\"watching\").get(\"userStories\")\n tasks = workInProgress.get(\"watching\").get(\"tasks\")\n issues = workInProgress.get(\"watching\").get(\"issues\")\n\n @.watching = userStories.concat(tasks).concat(issues)\n if @.watching.size > 0\n @.watching = @.watching.sortBy((elem) -> elem.get(\"modified_date\")).reverse()\n\n getWorkInProgress: (userId) ->\n return @homeService.getWorkInProgress(userId).then (workInProgress) =>\n @._setAssignedTo(workInProgress)\n @._setWatching(workInProgress)\n\nangular.module(\"taigaHome\").controller(\"WorkingOn\", WorkingOnController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: working-on.directive.coffee\n###\n\nWorkingOnDirective = (homeService, currentUserService) ->\n link = (scope, el, attrs, ctrl) ->\n user = currentUserService.getUser()\n # If we are not logged in the user will be null\n if user\n userId = user.get(\"id\")\n ctrl.getWorkInProgress(userId)\n\n return {\n controller: \"WorkingOn\",\n controllerAs: \"vm\",\n templateUrl: \"home/working-on/working-on.html\",\n scope: {},\n link: link\n }\n\nWorkingOnDirective.$inject = [\n \"tgHomeService\",\n \"tgCurrentUserService\"\n]\n\nangular.module(\"taigaHome\").directive(\"tgWorkingOn\", WorkingOnDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: dropdown-project-list.directive.coffee\n###\n\nDropdownProjectListDirective = (currentUserService, projectsService) ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n\n taiga.defineImmutableProperty(scope.vm, \"projects\", () -> currentUserService.projects.get(\"recents\"))\n\n scope.vm.newProject = ->\n projectsService.newProject()\n\n directive = {\n templateUrl: \"navigation-bar/dropdown-project-list/dropdown-project-list.html\"\n scope: {}\n link: link\n }\n\n return directive\n\nDropdownProjectListDirective.$inject = [\n \"tgCurrentUserService\",\n \"tgProjectsService\"\n]\n\nangular.module(\"taigaNavigationBar\").directive(\"tgDropdownProjectList\", DropdownProjectListDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: dropdown-user.directive.coffee\n###\n\nDropdownUserDirective = (authService, configService, locationService,\n navUrlsService, feedbackService) ->\n\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n scope.vm.isFeedbackEnabled = configService.get(\"feedbackEnabled\")\n taiga.defineImmutableProperty(scope.vm, \"user\", () -> authService.userData)\n\n scope.vm.logout = ->\n authService.logout()\n locationService.path(navUrlsService.resolve(\"login\"))\n\n scope.vm.sendFeedback = ->\n feedbackService.sendFeedback()\n\n directive = {\n templateUrl: \"navigation-bar/dropdown-user/dropdown-user.html\"\n scope: {}\n link: link\n }\n\n return directive\n\nDropdownUserDirective.$inject = [\n \"$tgAuth\",\n \"$tgConfig\",\n \"$tgLocation\",\n \"$tgNavUrls\",\n \"tgFeedbackService\"\n]\n\nangular.module(\"taigaNavigationBar\").directive(\"tgDropdownUser\", DropdownUserDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: navigation-bar.directive.coffee\n###\n\nNavigationBarDirective = (currentUserService, navigationBarService, $location) ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {}\n\n scope.$on \"$routeChangeSuccess\", () ->\n if $location.path() == \"/\"\n scope.vm.active = true\n else\n scope.vm.active = false\n\n taiga.defineImmutableProperty(scope.vm, \"projects\", () -> currentUserService.projects.get(\"recents\"))\n taiga.defineImmutableProperty(scope.vm, \"isAuthenticated\", () -> currentUserService.isAuthenticated())\n taiga.defineImmutableProperty(scope.vm, \"isEnabledHeader\", () -> navigationBarService.isEnabledHeader())\n\n\n directive = {\n templateUrl: \"navigation-bar/navigation-bar.html\"\n scope: {}\n link: link\n }\n\n return directive\n\nNavigationBarDirective.$inject = [\n \"tgCurrentUserService\",\n \"tgNavigationBarService\"\n \"$location\"\n]\n\nangular.module(\"taigaNavigationBar\").directive(\"tgNavigationBar\", NavigationBarDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: navigation-bar.service.coffee\n###\n\nclass NavigationBarService extends taiga.Service\n\n constructor: ->\n @.disableHeader()\n\n enableHeader: ->\n @.enabledHeader = true\n\n disableHeader: ->\n @.enabledHeader = false\n\n isEnabledHeader: ->\n return @.enabledHeader\n\nangular.module(\"taigaNavigationBar\").service(\"tgNavigationBarService\", NavigationBarService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-bar.controller.coffee\n###\n\nclass ProfileBarController\n @.$inject = [\n \"tgUserService\"\n ]\n\n constructor: (@userService) ->\n @.loadStats()\n\n loadStats: () ->\n return @userService.getStats(@.user.get(\"id\")).then (stats) =>\n @.stats = stats\n\nangular.module(\"taigaProfile\").controller(\"ProfileBar\", ProfileBarController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-bar.directive.coffee\n###\n\nProfileBarDirective = () ->\n return {\n templateUrl: \"profile/profile-bar/profile-bar.html\",\n controller: \"ProfileBar\",\n controllerAs: \"vm\",\n scope: {\n user: \"=user\",\n isCurrentUser: \"=iscurrentuser\"\n },\n bindToController: true\n }\n\n\nangular.module(\"taigaProfile\").directive(\"tgProfileBar\", ProfileBarDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-contacts.controller.coffee\n###\n\nclass ProfileContactsController\n @.$inject = [\n \"tgUserService\",\n \"tgCurrentUserService\"\n ]\n\n constructor: (@userService, @currentUserService) ->\n @.currentUser = @currentUserService.getUser()\n\n @.isCurrentUser = false\n\n if @.currentUser && @.currentUser.get(\"id\") == @.user.get(\"id\")\n @.isCurrentUser = true\n\n loadContacts: () ->\n @userService.getContacts(@.user.get(\"id\"))\n .then (contacts) =>\n @.contacts = contacts\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileContacts\", ProfileContactsController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-contacts.directive.coffee\n###\n\nProfileContactsDirective = () ->\n link = (scope, elm, attrs, ctrl) ->\n ctrl.loadContacts()\n\n return {\n templateUrl: \"profile/profile-contacts/profile-contacts.html\",\n scope: {\n user: \"=\"\n },\n controllerAs: \"vm\",\n controller: \"ProfileContacts\",\n link: link,\n bindToController: true\n }\n\nangular.module(\"taigaProfile\").directive(\"tgProfileContacts\", ProfileContactsDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: items.directive.coffee\n###\n\nFavItemDirective = ->\n link = (scope, el, attrs, ctrl) ->\n scope.vm = {item: scope.item}\n\n templateUrl = (el, attrs) ->\n if attrs.itemType == \"project\"\n return \"profile/profile-favs/items/project.html\"\n else # if attr.itemType in [\"userstory\", \"task\", \"issue\"]\n return \"profile/profile-favs/items/ticket.html\"\n\n return {\n scope: {\n \"item\": \"=tgFavItem\"\n }\n link: link\n templateUrl: templateUrl\n }\n\n\nangular.module(\"taigaProfile\").directive(\"tgFavItem\", FavItemDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-favs.controller.coffee\n###\n\ndebounceLeading = @.taiga.debounceLeading\n\nclass FavsBaseController\n constructor: ->\n @._init()\n\n #@._getItems = null # Define in inheritance classes\n #\n _init: ->\n @.enableFilterByAll = true\n @.enableFilterByProjects = true\n @.enableFilterByUserStories = true\n @.enableFilterByTasks = true\n @.enableFilterByIssues = true\n @.enableFilterByTextQuery = true\n\n @._resetList()\n @.q = null\n @.type = null\n\n _resetList: ->\n @.items = Immutable.List()\n @.scrollDisabled = false\n @._page = 1\n\n _enableLoadingSpinner: ->\n @.isLoading = true\n\n _disableLoadingSpinner: ->\n @.isLoading = false\n\n _enableScroll : ->\n @.scrollDisabled = false\n\n _disableScroll : ->\n @.scrollDisabled = true\n\n _checkIfHasMorePages: (hasNext) ->\n if hasNext\n @._page += 1\n @._enableScroll()\n else\n @._disableScroll()\n\n _checkIfHasNoResults: ->\n @.hasNoResults = @.items.size == 0\n\n loadItems: ->\n @._enableLoadingSpinner()\n @._disableScroll()\n\n @._getItems(@.user.get(\"id\"), @._page, @.type, @.q)\n .then (response) =>\n @.items = @.items.concat(response.get(\"data\"))\n\n @._checkIfHasMorePages(response.get(\"next\"))\n @._checkIfHasNoResults()\n @._disableLoadingSpinner()\n\n return @.items\n .catch =>\n @._disableLoadingSpinner()\n\n return @.items\n\n ################################################\n ## Filtre actions\n ################################################\n filterByTextQuery: debounceLeading 500, ->\n @._resetList()\n @.loadItems()\n\n showAll: ->\n if @.type isnt null\n @.type = null\n @._resetList()\n @.loadItems()\n\n showProjectsOnly: ->\n if @.type isnt \"project\"\n @.type = \"project\"\n @._resetList()\n @.loadItems()\n\n showUserStoriesOnly: ->\n if @.type isnt \"userstory\"\n @.type = \"userstory\"\n @._resetList()\n @.loadItems()\n\n showTasksOnly: ->\n if @.type isnt \"task\"\n @.type = \"task\"\n @._resetList()\n @.loadItems()\n\n showIssuesOnly: ->\n if @.type isnt \"issue\"\n @.type = \"issue\"\n @._resetList()\n @.loadItems()\n\n\n####################################################\n## Liked\n####################################################\n\nclass ProfileLikedController extends FavsBaseController\n @.$inject = [\n \"tgUserService\",\n ]\n\n constructor: (@userService) ->\n super()\n @.enableFilterByAll = false\n @.enableFilterByProjects = false\n @.enableFilterByUserStories = false\n @.enableFilterByTasks = false\n @.enableFilterByIssues = false\n @.enableFilterByTextQuery = true\n @._getItems = @userService.getLiked\n\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileLiked\", ProfileLikedController)\n\n####################################################\n## Voted\n####################################################\n\nclass ProfileVotedController extends FavsBaseController\n @.$inject = [\n \"tgUserService\",\n ]\n\n constructor: (@userService) ->\n super()\n @.enableFilterByAll = true\n @.enableFilterByProjects = false\n @.enableFilterByUserStories = true\n @.enableFilterByTasks = true\n @.enableFilterByIssues = true\n @.enableFilterByTextQuery = true\n @._getItems = @userService.getVoted\n\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileVoted\", ProfileVotedController)\n\n\n\n####################################################\n## Watched\n####################################################\n\nclass ProfileWatchedController extends FavsBaseController\n @.$inject = [\n \"tgUserService\",\n ]\n\n constructor: (@userService) ->\n super()\n @._getItems = @userService.getWatched\n\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileWatched\", ProfileWatchedController)\n\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-favs.directive.coffee\n###\n\nbase = {\n scope: {},\n bindToController: {\n user: \"=\"\n type: \"@\"\n q: \"@\"\n scrollDisabled: \"@\"\n isLoading: \"@\"\n hasNoResults: \"@\"\n }\n controller: null, # Define in directives\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-favs/profile-favs.html\",\n}\n\n\n####################################################\n## Liked\n####################################################\n\nProfileLikedDirective = () ->\n return _.extend({}, base, {\n controller: \"ProfileLiked\"\n })\n\nangular.module(\"taigaProfile\").directive(\"tgProfileLiked\", ProfileLikedDirective)\n\n\n####################################################\n## Voted\n####################################################\n\nProfileVotedDirective = () ->\n return _.extend({}, base, {\n controller: \"ProfileVoted\"\n })\n\nangular.module(\"taigaProfile\").directive(\"tgProfileVoted\", ProfileVotedDirective)\n\n\n####################################################\n## Watched\n####################################################\n\nProfileWatchedDirective = () ->\n return _.extend({}, base, {\n controller: \"ProfileWatched\"\n })\n\nangular.module(\"taigaProfile\").directive(\"tgProfileWatched\", ProfileWatchedDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-hints.controller.coffee\n###\n\nclass ProfileHints\n HINTS: [\n { #hint1\n url: \"https://taiga.io/support/import-export-projects/\"\n },\n { #hint2\n url: \"https://taiga.io/support/custom-fields/\"\n },\n { #hint3\n },\n { #hint4\n }\n ]\n constructor: (@translate) ->\n hintKey = Math.floor(Math.random() * @.HINTS.length) + 1\n\n @.hint = @.HINTS[hintKey - 1]\n\n @.hint.linkText = @.hint.linkText || 'HINTS.LINK'\n\n @.hint.title = @translate.instant(\"HINTS.HINT#{hintKey}_TITLE\")\n\n @.hint.text = @translate.instant(\"HINTS.HINT#{hintKey}_TEXT\")\n\nProfileHints.$inject = [\n \"$translate\"\n]\n\nangular.module(\"taigaProfile\").controller(\"ProfileHints\", ProfileHints)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-hints.directive.coffee\n###\n\nProfileHints = ($translate) ->\n return {\n scope: {},\n controller: \"ProfileHints\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-hints/profile-hints.html\"\n }\n\nProfileHints.$inject = [\n \"$translate\"\n]\n\nangular.module(\"taigaProfile\").directive(\"tgProfileHints\", ProfileHints)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-projects.controller.coffee\n###\n\nclass ProfileProjectsController\n @.$inject = [\n \"tgProjectsService\",\n \"tgUserService\"\n ]\n\n constructor: (@projectsService, @userService) ->\n\n loadProjects: () ->\n @projectsService.getProjectsByUserId(@.user.get(\"id\"))\n .then (projects) =>\n return @userService.attachUserContactsToProjects(@.user.get(\"id\"), projects)\n .then (projects) =>\n @.projects = projects\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileProjects\", ProfileProjectsController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-projects.directive.coffee\n###\n\nProfileProjectsDirective = () ->\n link = (scope, elm, attr, ctrl) ->\n ctrl.loadProjects()\n\n return {\n templateUrl: \"profile/profile-projects/profile-projects.html\",\n scope: {\n user: \"=\"\n },\n link: link\n bindToController: true,\n controllerAs: \"vm\",\n controller: \"ProfileProjects\"\n }\n\nangular.module(\"taigaProfile\").directive(\"tgProfileProjects\", ProfileProjectsDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-tab.directive.coffee\n###\n\nProfileTabDirective = () ->\n link = (scope, element, attrs, ctrl, transclude) ->\n scope.tab = {}\n\n attrs.$observe \"tgProfileTab\", (name) ->\n scope.tab.name = name\n\n attrs.$observe \"tabTitle\", (title) ->\n scope.tab.title = title\n\n scope.tab.icon = attrs.tabIcon\n scope.tab.active = !!attrs.tabActive\n\n if scope.$eval(attrs.tabDisabled) != true\n ctrl.addTab(scope.tab)\n\n return {\n templateUrl: \"profile/profile-tab/profile-tab.html\",\n scope: {},\n require: \"^tgProfileTabs\",\n link: link,\n transclude: true\n }\n\nangular.module(\"taigaProfile\")\n .directive(\"tgProfileTab\", ProfileTabDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-tabs.controller.coffee\n###\n\nclass ProfileTabsController\n constructor: () ->\n @tabs = []\n\n addTab: (tab) ->\n @tabs.push(tab)\n\n toggleTab: (tab) ->\n _.map @tabs, (tab) -> tab.active = false\n\n tab.active = true\n\nangular.module(\"taigaProfile\")\n .controller(\"ProfileTabs\", ProfileTabsController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile-tabs.directive.coffee\n###\n\nProfileTabsDirective = () ->\n return {\n scope: {}\n controller: \"ProfileTabs\"\n controllerAs: \"vm\"\n templateUrl: \"profile/profile-tabs/profile-tabs.html\"\n transclude: true\n }\n\nangular.module(\"taigaProfile\")\n .directive(\"tgProfileTabs\", ProfileTabsDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: profile.controller.coffee\n###\n\nclass ProfileController\n @.$inject = [\n \"tgAppMetaService\",\n \"tgCurrentUserService\",\n \"$routeParams\",\n \"tgUserService\",\n \"tgXhrErrorService\",\n \"$translate\"\n ]\n\n constructor: (@appMetaService, @currentUserService, @routeParams, @userService, @xhrError, @translate) ->\n @.isCurrentUser = false\n\n if @routeParams.slug\n @userService\n .getUserByUserName(@routeParams.slug)\n .then (user) =>\n if !user.get('is_active')\n @xhrError.notFound()\n else\n @.user = user\n @.isCurrentUser = false\n @._setMeta(@.user)\n\n return user\n .catch (xhr) =>\n return @xhrError.response(xhr)\n\n else\n @.user = @currentUserService.getUser()\n @.isCurrentUser = true\n @._setMeta(@.user)\n\n _setMeta: (user) ->\n ctx = {\n userFullName: user.get(\"full_name_display\"),\n userUsername: user.get(\"username\")\n }\n\n title = @translate.instant(\"USER.PROFILE.PAGE_TITLE\", ctx)\n\n description = user.get(\"bio\")\n @appMetaService.setAll(title, description)\n\nangular.module(\"taigaProfile\").controller(\"Profile\", ProfileController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: like-project-button.controller.coffee\n###\n\nclass LikeProjectButtonController\n @.$inject = [\n \"$tgConfirm\"\n \"tgLikeProjectButtonService\"\n ]\n\n constructor: (@confirm, @likeButtonService)->\n @.isMouseOver = false\n @.loading = false\n\n showTextWhenMouseIsOver: ->\n @.isMouseOver = true\n\n showTextWhenMouseIsLeave: ->\n @.isMouseOver = false\n\n toggleLike: ->\n @.loading = true\n\n if not @.project.get(\"is_fan\")\n promise = @._like()\n else\n promise = @._unlike()\n\n promise.finally () => @.loading = false\n\n return promise\n\n _like: ->\n return @likeButtonService.like(@.project.get('id'))\n .then =>\n @.showTextWhenMouseIsLeave()\n .catch =>\n @confirm.notify(\"error\")\n\n _unlike: ->\n return @likeButtonService.unlike(@.project.get('id')).catch =>\n @confirm.notify(\"error\")\n\nangular.module(\"taigaProjects\").controller(\"LikeProjectButton\", LikeProjectButtonController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: like-project-button.directive.coffee\n###\n\nLikeProjectButtonDirective = ->\n return {\n scope: {}\n controller: \"LikeProjectButton\",\n bindToController: {\n project: '='\n }\n controllerAs: \"vm\",\n templateUrl: \"projects/components/like-project-button/like-project-button.html\",\n }\n\nangular.module(\"taigaProjects\").directive(\"tgLikeProjectButton\", LikeProjectButtonDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: like-project-button.service.coffee\n###\n\ntaiga = @.taiga\n\nclass LikeProjectButtonService extends taiga.Service\n @.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"]\n\n constructor: (@rs, @currentUserService, @projectService) ->\n\n _getProjectIndex: (projectId) ->\n return @currentUserService.projects\n .get('all')\n .findIndex (project) -> project.get('id') == projectId\n\n _updateProjects: (projectId, isFan) ->\n projectIndex = @._getProjectIndex(projectId)\n projects = @currentUserService.projects\n .get('all')\n .update projectIndex, (project) ->\n\n totalFans = project.get(\"total_fans\")\n\n if isFan then totalFans++ else totalFans--\n\n return project.merge({\n is_fan: isFan,\n total_fans: totalFans\n })\n\n @currentUserService.setProjects(projects)\n\n _updateCurrentProject: (isFan) ->\n totalFans = @projectService.project.get(\"total_fans\")\n\n if isFan then totalFans++ else totalFans--\n\n project = @projectService.project.merge({\n is_fan: isFan,\n total_fans: totalFans\n })\n\n @projectService.setProject(project)\n\n like: (projectId) ->\n return @rs.projects.likeProject(projectId).then =>\n @._updateProjects(projectId, true)\n @._updateCurrentProject(true)\n\n unlike: (projectId) ->\n return @rs.projects.unlikeProject(projectId).then =>\n @._updateProjects(projectId, false)\n @._updateCurrentProject(false)\n\nangular.module(\"taigaProjects\").service(\"tgLikeProjectButtonService\", LikeProjectButtonService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: sort-projects.directive.coffee\n###\n\nSortProjectsDirective = (currentUserService) ->\n link = (scope, el, attrs, ctrl) ->\n itemEl = null\n\n el.sortable({\n dropOnEmpty: true\n revert: 200\n axis: \"y\"\n opacity: .95\n placeholder: 'placeholder'\n cancel: '.project-name'\n })\n\n el.on \"sortstop\", (event, ui) ->\n itemEl = ui.item\n project = itemEl.scope().project\n index = itemEl.index()\n\n sorted_project_ids = _.map(scope.projects.toJS(), (p) -> p.id)\n sorted_project_ids = _.without(sorted_project_ids, project.get(\"id\"))\n sorted_project_ids.splice(index, 0, project.get('id'))\n\n sortData = []\n\n for value, index in sorted_project_ids\n sortData.push({\"project_id\": value, \"order\":index})\n\n currentUserService.bulkUpdateProjectsOrder(sortData)\n\n directive = {\n scope: {\n projects: \"=tgSortProjects\"\n },\n link: link\n }\n\n return directive\n\nangular.module(\"taigaProjects\").directive(\"tgSortProjects\", [\"tgCurrentUserService\", SortProjectsDirective])\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-project-button.controller.coffee\n###\n\nclass WatchProjectButtonController\n @.$inject = [\n \"$tgConfirm\"\n \"tgWatchProjectButtonService\"\n ]\n\n constructor: (@confirm, @watchButtonService)->\n @.showWatchOptions = false\n @.loading = false\n\n toggleWatcherOptions: () ->\n @.showWatchOptions = !@.showWatchOptions\n\n closeWatcherOptions: () ->\n @.showWatchOptions = false\n\n watch: (notifyLevel) ->\n @.loading = true\n @.closeWatcherOptions()\n\n return @watchButtonService.watch(@.project.get('id'), notifyLevel)\n .catch () => @confirm.notify(\"error\")\n .finally () => @.loading = false\n\n unwatch: ->\n @.loading = true\n @.closeWatcherOptions()\n\n return @watchButtonService.unwatch(@.project.get('id'))\n .catch () => @confirm.notify(\"error\")\n .finally () => @.loading = false\n\nangular.module(\"taigaProjects\").controller(\"WatchProjectButton\", WatchProjectButtonController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-project-button.directive.coffee\n###\n\nWatchProjectButtonDirective = ->\n return {\n scope: {}\n controller: \"WatchProjectButton\",\n bindToController: {\n project: \"=\"\n }\n controllerAs: \"vm\",\n templateUrl: \"projects/components/watch-project-button/watch-project-button.html\",\n }\n\nangular.module(\"taigaProjects\").directive(\"tgWatchProjectButton\", WatchProjectButtonDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: watch-project-button.service.coffee\n###\n\ntaiga = @.taiga\n\nclass WatchProjectButtonService extends taiga.Service\n @.$inject = [\n \"tgResources\",\n \"tgCurrentUserService\",\n \"tgProjectService\"\n ]\n\n constructor: (@rs, @currentUserService, @projectService) ->\n\n _getProjectIndex: (projectId) ->\n return @currentUserService.projects\n .get('all')\n .findIndex (project) -> project.get('id') == projectId\n\n\n _updateProjects: (projectId, notifyLevel, isWatcher) ->\n projectIndex = @._getProjectIndex(projectId)\n\n projects = @currentUserService.projects\n .get('all')\n .update projectIndex, (project) =>\n totalWatchers = project.get('total_watchers')\n\n if isWatcher then totalWatchers++ else totalWatchers--\n\n return project.merge({\n is_watcher: isWatcher,\n total_watchers: totalWatchers\n notify_level: notifyLevel\n })\n\n @currentUserService.setProjects(projects)\n\n _updateCurrentProject: (notifyLevel, isWatcher) ->\n totalWatchers = @projectService.project.get(\"total_watchers\")\n\n if isWatcher then totalWatchers++ else totalWatchers--\n\n project = @projectService.project.merge({\n is_watcher: isWatcher,\n total_watchers: totalWatchers\n notify_level: notifyLevel\n })\n\n @projectService.setProject(project)\n\n watch: (projectId, notifyLevel) ->\n return @rs.projects.watchProject(projectId, notifyLevel).then =>\n @._updateProjects(projectId, notifyLevel, true)\n @._updateCurrentProject(notifyLevel, true)\n\n unwatch: (projectId) ->\n return @rs.projects.unwatchProject(projectId).then =>\n @._updateProjects(projectId, null, false)\n @._updateCurrentProject(null, false)\n\nangular.module(\"taigaProjects\").service(\"tgWatchProjectButtonService\", WatchProjectButtonService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: projects-listing.controller.coffee\n###\n\nclass ProjectsListingController\n @.$inject = [\n \"tgCurrentUserService\",\n \"tgProjectsService\",\n ]\n\n constructor: (@currentUserService, @projectsService) ->\n taiga.defineImmutableProperty(@, \"projects\", () => @currentUserService.projects.get(\"all\"))\n\n newProject: ->\n @projectsService.newProject()\n\nangular.module(\"taigaProjects\").controller(\"ProjectsListing\", ProjectsListingController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: project.controller.coffee\n###\n\nclass ProjectController\n @.$inject = [\n \"$routeParams\",\n \"tgAppMetaService\",\n \"$tgAuth\",\n \"$translate\",\n \"tgProjectService\"\n ]\n\n constructor: (@routeParams, @appMetaService, @auth, @translate, @projectService) ->\n projectSlug = @routeParams.pslug\n @.user = @auth.userData\n\n taiga.defineImmutableProperty @, \"project\", () => return @projectService.project\n taiga.defineImmutableProperty @, \"members\", () => return @projectService.activeMembers\n\n @appMetaService.setfn @._setMeta.bind(this)\n\n _setMeta: (project)->\n metas = {}\n\n return metas if !@.project\n\n ctx = {projectName: @.project.get(\"name\")}\n\n metas.title = @translate.instant(\"PROJECT.PAGE_TITLE\", ctx)\n metas.description = @.project.get(\"description\")\n\n return metas\n\nangular.module(\"taigaProjects\").controller(\"Project\", ProjectController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: projects.service.coffee\n###\n\ntaiga = @.taiga\ngroupBy = @.taiga.groupBy\n\nclass ProjectsService extends taiga.Service\n @.$inject = [\"tgResources\", \"$projectUrl\", \"tgLightboxFactory\"]\n\n constructor: (@rs, @projectUrl, @lightboxFactory) ->\n\n getProjectBySlug: (projectSlug) ->\n return @rs.projects.getProjectBySlug(projectSlug)\n .then (project) =>\n return @._decorate(project)\n\n getProjectStats: (projectId) ->\n return @rs.projects.getProjectStats(projectId)\n\n getProjectsByUserId: (userId, paginate) ->\n return @rs.projects.getProjectsByUserId(userId, paginate)\n .then (projects) =>\n return projects.map @._decorate.bind(@)\n\n _decorate: (project) ->\n url = @projectUrl.get(project.toJS())\n\n project = project.set(\"url\", url)\n colorized_tags = []\n\n if project.get(\"tags\")\n tags = project.get(\"tags\").sort()\n\n colorized_tags = tags.map (tag) ->\n color = project.get(\"tags_colors\").get(tag)\n return Immutable.fromJS({name: tag, color: color})\n\n project = project.set(\"colorized_tags\", colorized_tags)\n\n return project\n\n newProject: ->\n @lightboxFactory.create(\"tg-lb-create-project\", {\n \"class\": \"wizard-create-project\"\n })\n\n bulkUpdateProjectsOrder: (sortData) ->\n return @rs.projects.bulkUpdateOrder(sortData)\n\nangular.module(\"taigaProjects\").service(\"tgProjectsService\", ProjectsService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: external-apps-resource.service.coffee\n###\n\nResource = (urlsService, http) ->\n service = {}\n\n service.getApplicationToken = (applicationId, state) ->\n url = urlsService.resolve(\"applications\")\n url = \"#{url}/#{applicationId}/token?state=#{state}\"\n return http.get(url).then (result) ->\n Immutable.fromJS(result.data)\n\n service.authorizeApplicationToken = (applicationId, state) ->\n url = urlsService.resolve(\"application-tokens\")\n url = \"#{url}/authorize\"\n data = {\n \"state\": state\n \"application\": applicationId\n }\n\n return http.post(url, data).then (result) ->\n Immutable.fromJS(result.data)\n\n return () ->\n return {\"externalapps\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgExternalAppsResource\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: issues-resource.service.coffee\n###\n\nResource = (urlsService, http) ->\n service = {}\n\n service.listInAllProjects = (params) ->\n url = urlsService.resolve(\"issues\")\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n return () ->\n return {\"issues\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgIssuesResource\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: projects-resource.service.coffee\n###\n\npagination = () ->\n\nResource = (urlsService, http, paginateResponseService) ->\n service = {}\n\n service.getProjectBySlug = (projectSlug) ->\n url = urlsService.resolve(\"projects\")\n\n url = \"#{url}/by_slug?slug=#{projectSlug}\"\n\n return http.get(url)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getProjectsByUserId = (userId, paginate=false) ->\n url = urlsService.resolve(\"projects\")\n httpOptions = {}\n\n if !paginate\n httpOptions.headers = {\n \"x-disable-pagination\": \"1\"\n }\n\n params = {\"member\": userId, \"order_by\": \"memberships__user_order\"}\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getProjectStats = (projectId) ->\n url = urlsService.resolve(\"projects\")\n url = \"#{url}/#{projectId}\"\n\n return http.get(url)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.bulkUpdateOrder = (bulkData) ->\n url = urlsService.resolve(\"bulk-update-projects-order\")\n return http.post(url, bulkData)\n\n service.getTimeline = (projectId, page) ->\n params = {\n page: page\n }\n\n url = urlsService.resolve(\"timeline-project\")\n url = \"#{url}/#{projectId}\"\n\n return http.get(url, params).then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.likeProject = (projectId) ->\n url = urlsService.resolve(\"project-like\", projectId)\n return http.post(url)\n\n service.unlikeProject = (projectId) ->\n url = urlsService.resolve(\"project-unlike\", projectId)\n return http.post(url)\n\n service.watchProject = (projectId, notifyPolicy) ->\n data = {\n notify_policy: notifyPolicy\n }\n url = urlsService.resolve(\"project-watch\", projectId)\n return http.post(url, data)\n\n service.unwatchProject = (projectId) ->\n url = urlsService.resolve(\"project-unwatch\", projectId)\n return http.post(url)\n\n return () ->\n return {\"projects\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgProjectsResources\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: resources.coffee\n###\n\nservices = [\n \"tgProjectsResources\",\n \"tgUserResources\",\n \"tgUsersResources\",\n \"tgUserstoriesResource\",\n \"tgTasksResource\",\n \"tgIssuesResource\",\n \"tgExternalAppsResource\"\n]\n\nResources = ($injector) ->\n for serviceName in services\n serviceFn = $injector.get(serviceName)\n\n service = $injector.invoke(serviceFn)\n\n for serviceProperty in Object.keys(service)\n if @[serviceProperty]\n console.warm(\"repeated resource \" + serviceProperty)\n\n @[serviceProperty] = service[serviceProperty]\n\n return @\n\n\nResources.$inject = [\"$injector\"]\n\nangular.module(\"taigaResources2\").service(\"tgResources\", Resources)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: tasks-resource.service.coffee\n###\n\nResource = (urlsService, http) ->\n service = {}\n\n service.listInAllProjects = (params) ->\n url = urlsService.resolve(\"tasks\")\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n return () ->\n return {\"tasks\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgTasksResource\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-resource.service.coffee\n###\n\nResource = (urlsService, http, paginateResponseService) ->\n service = {}\n\n service.getUserStorage = (key) ->\n url = urlsService.resolve(\"user-storage\")\n\n if key\n url += '/' + key\n\n httpOptions = {}\n\n return http.get(url, {}).then (response) ->\n return response.data.value\n\n service.setUserStorage = (key, value) ->\n url = urlsService.resolve(\"user-storage\") + '/' + key\n\n params = {\n key: key,\n value: value\n }\n\n return http.put(url, params)\n\n service.createUserStorage = (key, value) ->\n url = urlsService.resolve(\"user-storage\")\n\n params = {\n key: key,\n value: value\n }\n\n return http.post(url, params)\n\n return () ->\n return {\"user\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgUserResources\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: users-resource.service.coffee\n###\n\nResource = (urlsService, http, paginateResponseService) ->\n service = {}\n\n service.getUserByUsername = (username) ->\n url = urlsService.resolve(\"by_username\")\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n params = {\n username: username\n }\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getStats = (userId) ->\n url = urlsService.resolve(\"user-stats\", userId)\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, {}, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getContacts = (userId) ->\n url = urlsService.resolve(\"user-contacts\", userId)\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, {}, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n service.getLiked = (userId, page, type, q) ->\n url = urlsService.resolve(\"user-liked\", userId)\n\n params = {}\n params.page = page if page?\n params.type = type if type?\n params.q = q if q?\n\n return http.get(url, params)\n .then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.getVoted = (userId, page, type, q) ->\n url = urlsService.resolve(\"user-voted\", userId)\n\n params = {}\n params.page = page if page?\n params.type = type if type?\n params.q = q if q?\n\n return http.get(url, params)\n .then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.getWatched = (userId, page, type, q) ->\n url = urlsService.resolve(\"user-watched\", userId)\n\n params = {}\n params.page = page if page?\n params.type = type if type?\n params.q = q if q?\n\n return http.get(url, params)\n .then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.getProfileTimeline = (userId, page) ->\n params = {\n page: page\n }\n\n url = urlsService.resolve(\"timeline-profile\")\n url = \"#{url}/#{userId}\"\n\n return http.get(url, params).then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n service.getUserTimeline = (userId, page) ->\n params = {\n page: page\n }\n\n url = urlsService.resolve(\"timeline-user\")\n url = \"#{url}/#{userId}\"\n\n return http.get(url, params).then (result) ->\n result = Immutable.fromJS(result)\n return paginateResponseService(result)\n\n return () ->\n return {\"users\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgUsersResources\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: userstories-resource.service.coffee\n###\n\nResource = (urlsService, http) ->\n service = {}\n\n service.listInAllProjects = (params) ->\n url = urlsService.resolve(\"userstories\")\n\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n }\n\n return http.get(url, params, httpOptions)\n .then (result) ->\n return Immutable.fromJS(result.data)\n\n return () ->\n return {\"userstories\": service}\n\nResource.$inject = [\"$tgUrls\", \"$tgHttp\"]\n\nmodule = angular.module(\"taigaResources2\")\nmodule.factory(\"tgUserstoriesResource\", Resource)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: app-meta.service.coffee\n###\n\ntaiga = @.taiga\n\ntruncate = taiga.truncate\n\n\nclass AppMetaService\n @.$inject = [\n \"$rootScope\"\n ]\n\n constructor: (@rootScope) ->\n\n _set: (key, value) ->\n return if not key\n\n if key == \"title\"\n meta = $(\"title\")\n\n if meta.length == 0\n meta = $(\"\")\n $(\"head\").append(meta)\n\n meta.text(value or \"\")\n else if key.indexOf(\"og:\") == 0\n meta = $(\"meta[property='#{key}']\")\n\n if meta.length == 0\n meta = $(\"\")\n $(\"head\").append(meta)\n\n meta.attr(\"content\", value or \"\")\n else\n meta = $(\"meta[name='#{key}']\")\n\n if meta.length == 0\n meta = $(\"\")\n $(\"head\").append(meta)\n\n meta.attr(\"content\", value or \"\")\n\n setTitle: (title) ->\n @._set('title', title)\n\n setDescription: (description) ->\n @._set(\"description\", truncate(description, 250))\n\n setTwitterMetas: (title, description) ->\n @._set(\"twitter:card\", \"summary\")\n @._set(\"twitter:site\", \"@taigaio\")\n @._set(\"twitter:title\", title)\n @._set(\"twitter:description\", truncate(description, 300))\n @._set(\"twitter:image\", \"#{window.location.origin}/images/logo-color.png\")\n\n setOpenGraphMetas: (title, description) ->\n @._set(\"og:type\", \"object\")\n @._set(\"og:site_name\", \"Taiga - Love your projects\")\n @._set(\"og:title\", title)\n @._set(\"og:description\", truncate(description, 300))\n @._set(\"og:image\", \"#{window.location.origin}/images/logo-color.png\")\n @._set(\"og:url\", window.location.href)\n\n setAll: (title, description) ->\n @.setTitle(title)\n @.setDescription(description)\n @.setTwitterMetas(title, description)\n @.setOpenGraphMetas(title, description)\n\n addMobileViewport: () ->\n $(\"head\").append(\n \"\"\n )\n\n removeMobileViewport: () ->\n $(\"meta[name=\\\"viewport\\\"]\").remove()\n\n setfn: (fn) ->\n @._listener() if @.listener\n\n @._listener = @rootScope.$watchCollection fn, (metas) =>\n @.setAll(metas.title, metas.description)\n\n\nangular.module(\"taigaCommon\").service(\"tgAppMetaService\", AppMetaService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: check-permissions.service.coffee\n###\n\ntaiga = @.taiga\n\nclass ChekcPermissionsService\n @.$inject = [\n \"tgProjectService\"\n ]\n\n constructor: (@projectService) ->\n\n check: (permission) ->\n return @projectService.project.get('my_permissions').indexOf(permission) != -1\n\nangular.module(\"taigaCommon\").service(\"tgCheckPermissionsService\", ChekcPermissionsService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: current-user.service.coffee\n###\n\ntaiga = @.taiga\n\ngroupBy = @.taiga.groupBy\n\nclass CurrentUserService\n @.$inject = [\n \"tgProjectsService\",\n \"$tgStorage\",\n \"tgResources\"\n ]\n\n constructor: (@projectsService, @storageService, @rs) ->\n @._user = null\n @._projects = Immutable.Map()\n @._projectsById = Immutable.Map()\n @._joyride = null\n\n taiga.defineImmutableProperty @, \"projects\", () => return @._projects\n taiga.defineImmutableProperty @, \"projectsById\", () => return @._projectsById\n\n isAuthenticated: ->\n if @.getUser() != null\n return true\n return false\n\n getUser: () ->\n if !@._user\n userData = @storageService.get(\"userInfo\")\n\n if userData\n userData = Immutable.fromJS(userData)\n @.setUser(userData)\n\n return @._user\n\n removeUser: () ->\n @._user = null\n @._projects = Immutable.Map()\n @._projectsById = Immutable.Map()\n @._joyride = null\n\n setUser: (user) ->\n @._user = user\n\n return @._loadUserInfo()\n\n bulkUpdateProjectsOrder: (sortData) ->\n @projectsService.bulkUpdateProjectsOrder(sortData).then () =>\n @.loadProjects()\n\n loadProjects: () ->\n return @projectsService.getProjectsByUserId(@._user.get(\"id\"))\n .then (projects) => @.setProjects(projects)\n\n disableJoyRide: (section) ->\n if section\n @._joyride[section] = false\n else\n @._joyride = {\n backlog: false,\n kanban: false,\n dashboard: false\n }\n\n @rs.user.setUserStorage('joyride', @._joyride)\n\n loadJoyRideConfig: () ->\n return new Promise (resolve) =>\n if @._joyride != null\n resolve(@._joyride)\n return\n\n @rs.user.getUserStorage('joyride')\n .then (config) =>\n @._joyride = config\n resolve(@._joyride)\n .catch () =>\n #joyride not defined\n @._joyride = {\n backlog: true,\n kanban: true,\n dashboard: true\n }\n\n @rs.user.createUserStorage('joyride', @._joyride)\n\n resolve(@._joyride)\n\n _loadUserInfo: () ->\n return Promise.all([\n @.loadProjects()\n ])\n\n setProjects: (projects) ->\n @._projects = @._projects.set(\"all\", projects)\n @._projects = @._projects.set(\"recents\", projects.slice(0, 10))\n\n @._projectsById = Immutable.fromJS(groupBy(projects.toJS(), (p) -> p.id))\n\n return @.projects\n\nangular.module(\"taigaCommon\").service(\"tgCurrentUserService\", CurrentUserService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: lightbox-factory.service.coffee\n###\n\nclass LightboxFactory\n @.$inject = [\"$rootScope\", \"$compile\"]\n constructor: (@rootScope, @compile) ->\n\n create: (name, attrs) ->\n scope = @rootScope.$new()\n\n elm = $(\"
\")\n .attr(name, true)\n .attr(\"tg-bind-scope\", true)\n\n if attrs\n elm.attr(attrs)\n\n elm.addClass(\"remove-on-close\")\n\n html = @compile(elm)(scope)\n\n $(document.body).append(html)\n\n return\n\nangular.module(\"taigaCommon\").service(\"tgLightboxFactory\", LightboxFactory)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: paginate-response.service.coffee\n###\n\nPaginateResponse = () ->\n return (result) ->\n paginateResponse = Immutable.Map({\n \"data\": result.get(\"data\"),\n \"next\": !!result.get(\"headers\")(\"x-pagination-next\"),\n \"prev\": !!result.get(\"headers\")(\"x-pagination-prev\"),\n \"current\": result.get(\"headers\")(\"x-pagination-current\"),\n \"count\": result.get(\"headers\")(\"x-pagination-count\")\n })\n\n return paginateResponse\n\nangular.module(\"taigaCommon\").factory(\"tgPaginateResponseService\", PaginateResponse)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: project.service.coffee\n###\n\ntaiga = @.taiga\n\nclass ProjectService\n @.$inject = [\n \"tgProjectsService\",\n \"tgXhrErrorService\"\n ]\n\n constructor: (@projectsService, @xhrError) ->\n @._project = null\n @._section = null\n @._sectionsBreadcrumb = Immutable.List()\n @._activeMembers = Immutable.List()\n\n taiga.defineImmutableProperty @, \"project\", () => return @._project\n taiga.defineImmutableProperty @, \"section\", () => return @._section\n taiga.defineImmutableProperty @, \"sectionsBreadcrumb\", () => return @._sectionsBreadcrumb\n taiga.defineImmutableProperty @, \"activeMembers\", () => return @._activeMembers\n\n setSection: (section) ->\n @._section = section\n\n if section\n @._sectionsBreadcrumb = @._sectionsBreadcrumb.push(@._section)\n else\n @._sectionsBreadcrumb = Immutable.List()\n\n setProjectBySlug: (pslug) ->\n return new Promise (resolve, reject) =>\n if !@.project || @.project.get('slug') != pslug\n @projectsService\n .getProjectBySlug(pslug)\n .then (project) =>\n @.setProject(project)\n resolve()\n .catch (xhr) =>\n @xhrError.response(xhr)\n\n else resolve()\n\n setProject: (project) ->\n @._project = project\n @._activeMembers = @._project.get('members').filter (member) -> member.get('is_active')\n\n cleanProject: () ->\n @._project = null\n @._activeMembers = Immutable.List()\n @._section = null\n @._sectionsBreadcrumb = Immutable.List()\n\n fetchProject: () ->\n pslug = @.project.get('slug')\n\n return @projectsService.getProjectBySlug(pslug).then (project) => @.setProject(project)\n\nangular.module(\"taigaCommon\").service(\"tgProjectService\", ProjectService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: scope-event.service.coffee\n###\n\nclass ScopeEvent\n scopes: {},\n _searchDuplicatedScopes: (id) ->\n return _.find Object.keys(@scopes), (key) =>\n return @scopes[key].$id == id\n\n _create: (name, scope) ->\n duplicatedScopeName = @._searchDuplicatedScopes(scope.$id)\n\n if duplicatedScopeName\n throw new Error(\"scopeEvent: this scope is already\n register with the name \\\"\" + duplicatedScopeName + \"\\\"\")\n\n if @scopes[name]\n throw new Error(\"scopeEvent: \\\"\" + name + \"\\\" already in use\")\n else\n scope._tgEmitter = new EventEmitter2()\n\n scope.$on \"$destroy\", () =>\n scope._tgEmitter.removeAllListeners()\n delete @scopes[name]\n\n @scopes[name] = scope\n\n emitter: (name, scope) ->\n if scope\n scope = @._create(name, scope)\n else if @scopes[name]\n scope = @scopes[name]\n else\n throw new Error(\"scopeEvent: \\\"\" + name + \"\\\" scope doesn't exist'\")\n\n return scope._tgEmitter\n\nangular.module(\"taigaCommon\").service(\"tgScopeEvent\", ScopeEvent)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: theme.service.coffee\n###\n\ntaiga = @.taiga\n\n\nclass ThemeService extends taiga.Service = ->\n use: (themeName) ->\n stylesheetEl = $(\"link[rel='stylesheet']\")\n\n if stylesheetEl.length == 0\n stylesheetEl = $(\"\")\n $(\"head\").append(stylesheetEl)\n\n stylesheetEl.attr(\"href\", \"/styles/theme-#{themeName}.css\")\n\n\nangular.module(\"taigaCommon\").service(\"tgThemeService\", ThemeService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user.service.coffee\n###\n\ntaiga = @.taiga\nbindMethods = taiga.bindMethods\n\n\nclass UserService extends taiga.Service\n @.$inject = [\"tgResources\"]\n\n constructor: (@rs) ->\n bindMethods(@)\n\n getUserByUserName: (username) ->\n return @rs.users.getUserByUsername(username)\n\n getContacts: (userId) ->\n return @rs.users.getContacts(userId)\n\n getLiked: (userId, pageNumber, objectType, textQuery) ->\n return @rs.users.getLiked(userId, pageNumber, objectType, textQuery)\n\n getVoted: (userId, pageNumber, objectType, textQuery) ->\n return @rs.users.getVoted(userId, pageNumber, objectType, textQuery)\n\n getWatched: (userId, pageNumber, objectType, textQuery) ->\n return @rs.users.getWatched(userId, pageNumber, objectType, textQuery)\n\n getStats: (userId) ->\n return @rs.users.getStats(userId)\n\n attachUserContactsToProjects: (userId, projects) ->\n return @.getContacts(userId)\n .then (contacts) ->\n projects = projects.map (project) ->\n contactsFiltered = contacts.filter (contact) ->\n contactId = contact.get(\"id\")\n return project.get('members').indexOf(contactId) != -1\n\n project = project.set(\"contacts\", contactsFiltered)\n\n return project\n\n return projects\n\nangular.module(\"taigaCommon\").service(\"tgUserService\", UserService)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: xhrError.service.coffee\n###\n\nclass xhrError extends taiga.Service\n @.$inject = [\n \"$q\",\n \"$location\",\n \"$tgNavUrls\"\n ]\n\n constructor: (@q, @location, @navUrls) ->\n\n notFound: () ->\n @location.path(@navUrls.resolve(\"not-found\"))\n @location.replace()\n\n permissionDenied: () ->\n @location.path(@navUrls.resolve(\"permission-denied\"))\n @location.replace()\n\n response: (xhr) ->\n if xhr\n if xhr.status == 404\n @.notFound()\n\n else if xhr.status == 403\n @.permissionDenied()\n\n return @q.reject(xhr)\n\nangular.module(\"taigaCommon\").service(\"tgXhrErrorService\", xhrError)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-attachment.directive.coffee\n###\n\nUserTimelineAttachmentDirective = (template, $compile) ->\n validFileExtensions = [\".jpg\", \".jpeg\", \".bmp\", \".gif\", \".png\"]\n\n isImage = (url) ->\n url = url.toLowerCase()\n\n return _.some validFileExtensions, (extension) ->\n return url.indexOf(extension, url - extension.length) != -1\n\n link = (scope, el) ->\n is_image = isImage(scope.attachment.get('url'))\n\n if is_image\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment-image.html\")\n else\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment.html\")\n\n el.html(templateHtml)\n $compile(el.contents())(scope)\n\n el.find(\"img\").error () -> @.remove()\n\n return {\n link: link\n scope: {\n attachment: \"=tgUserTimelineAttachment\"\n }\n }\n\nUserTimelineAttachmentDirective.$inject = [\n \"$tgTemplate\",\n \"$compile\"\n]\n\nangular.module(\"taigaUserTimeline\")\n .directive(\"tgUserTimelineAttachment\", UserTimelineAttachmentDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-item-title.service.coffee\n###\n\nunslugify = @.taiga.unslugify\n\nclass UserTimelineItemTitle\n @.$inject = [\n \"$translate\"\n ]\n\n _fieldTranslationKey: {\n 'status': 'COMMON.FIELDS.STATUS',\n 'subject': 'COMMON.FIELDS.SUBJECT',\n 'description_diff': 'COMMON.FIELDS.DESCRIPTION',\n 'points': 'COMMON.FIELDS.POINTS',\n 'assigned_to': 'COMMON.FIELDS.ASSIGNED_TO',\n 'severity': 'ISSUES.FIELDS.SEVERITY',\n 'priority': 'ISSUES.FIELDS.PRIORITY',\n 'type': 'ISSUES.FIELDS.TYPE',\n 'is_iocaine': 'TASK.FIELDS.IS_IOCAINE',\n 'is_blocked': 'COMMON.FIELDS.IS_BLOCKED'\n }\n\n _params: {\n username: (timeline, event) ->\n user = timeline.getIn(['data', 'user'])\n\n if user.get('is_profile_visible')\n title_attr = @translate.instant('COMMON.SEE_USER_PROFILE', {username: user.get('username')})\n url = \"user-profile:username=timeline.getIn(['data', 'user', 'username'])\"\n\n return @._getLink(url, user.get('name'), title_attr)\n else\n return @._getUsernameSpan(user.get('name'))\n\n field_name: (timeline, event) ->\n field_name = timeline.getIn(['data', 'value_diff', 'key'])\n\n return @translate.instant(@._fieldTranslationKey[field_name])\n\n project_name: (timeline, event) ->\n url = \"project:project=timeline.getIn(['data', 'project', 'slug'])\"\n\n return @._getLink(url, timeline.getIn([\"data\", \"project\", \"name\"]))\n\n new_value: (timeline, event) ->\n if _.isArray(timeline.getIn([\"data\", \"value_diff\", \"value\"]).toJS())\n value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).get(1)\n\n # assigned to unasigned\n if value == null && timeline.getIn([\"data\", \"value_diff\", \"key\"]) == 'assigned_to'\n value = @translate.instant('ACTIVITY.VALUES.UNASSIGNED')\n\n return value\n else\n return timeline.getIn([\"data\", \"value_diff\", \"value\"]).first().get(1)\n\n sprint_name: (timeline, event) ->\n url = \"project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])\"\n\n return @._getLink(url, timeline.getIn(['data', 'milestone', 'name']))\n\n us_name: (timeline, event) ->\n obj = @._getTimelineObj(timeline, event).get('userstory')\n\n event_us = {obj: 'parent_userstory'}\n url = @._getDetailObjUrl(event_us)\n\n text = '#' + obj.get('ref') + ' ' + obj.get('subject')\n\n return @._getLink(url, text)\n\n obj_name: (timeline, event) ->\n obj = @._getTimelineObj(timeline, event)\n url = @._getDetailObjUrl(event)\n\n if event.obj == 'wikipage'\n text = unslugify(obj.get('slug'))\n else if event.obj == 'milestone'\n text = obj.get('name')\n else\n text = '#' + obj.get('ref') + ' ' + obj.get('subject')\n\n return @._getLink(url, text)\n\n role_name: (timeline, event) ->\n return timeline.getIn(['data', 'value_diff', 'value']).keySeq().first()\n }\n\n constructor: (@translate) ->\n\n\n _translateTitleParams: (param, timeline, event) ->\n return @._params[param].call(this, timeline, event)\n\n _getTimelineObj: (timeline, event) ->\n return timeline.getIn(['data', event.obj])\n\n _getDetailObjUrl: (event) ->\n url = {\n \"issue\": [\"project-issues-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"wikipage\": [\"project-wiki-page\", \":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])\"],\n \"task\": [\"project-tasks-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"parent_userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])\"],\n \"milestone\": [\"project-taskboard\", \":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])\"]\n }\n\n return url[event.obj][0] + url[event.obj][1]\n\n _getLink: (url, text, title) ->\n title = title || text\n\n return $('')\n .attr('tg-nav', url)\n .text(text)\n .attr('title', title)\n .prop('outerHTML')\n\n _getUsernameSpan: (text) ->\n title = title || text\n\n return $('')\n .addClass('username')\n .text(text)\n .prop('outerHTML')\n\n _getParams: (timeline, event, timeline_type) ->\n params = {}\n\n timeline_type.translate_params.forEach (param) =>\n params[param] = @._translateTitleParams(param, timeline, event)\n\n return params\n\n getTitle: (timeline, event, type) ->\n return @translate.instant(type.key, @._getParams(timeline, event, type))\n\nangular.module(\"taigaUserTimeline\")\n .service(\"tgUserTimelineItemTitle\", UserTimelineItemTitle)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-item-type.service.coffee\n###\n\ntimelineType = (timeline, event) ->\n types = [\n { # NewMember\n check: (timeline, event) ->\n return event.obj == 'membership'\n key: 'TIMELINE.NEW_MEMBER',\n translate_params: ['project_name']\n member: (timeline) ->\n return Immutable.Map({\n user: timeline.getIn(['data', 'user']),\n role: timeline.getIn(['data', 'role'])\n })\n },\n { # NewProject\n check: (timeline, event) ->\n return event.obj == 'project' && event.type == 'create'\n key: 'TIMELINE.NEW_PROJECT',\n translate_params: ['username', 'project_name'],\n description: (timeline) ->\n return timeline.getIn(['data', 'project', 'description'])\n },\n { # NewAttachment\n check: (timeline, event) ->\n return event.type == 'change' &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'attachments'\n key: 'TIMELINE.UPLOAD_ATTACHMENT',\n translate_params: ['username', 'obj_name']\n },\n { # NewUs\n check: (timeline, event) ->\n return event.obj == 'userstory' && event.type == 'create'\n key: 'TIMELINE.US_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewIssue\n check: (timeline, event) ->\n return event.obj == 'issue' && event.type == 'create'\n key: 'TIMELINE.ISSUE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewWiki\n check: (timeline, event) ->\n return event.obj == 'wikipage' && event.type == 'create'\n key: 'TIMELINE.WIKI_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewTask\n check: (timeline, event) ->\n return event.obj == 'task' && event.type == 'create' && !timeline.getIn(['data', 'task', 'userstory'])\n key: 'TIMELINE.TASK_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewTask with US\n check: (timeline, event) ->\n return event.obj == 'task' && event.type == 'create' && timeline.getIn(['data', 'task', 'userstory'])\n key: 'TIMELINE.TASK_CREATED_WITH_US',\n translate_params: ['username', 'project_name', 'obj_name', 'us_name']\n },\n { # NewMilestone\n check: (timeline, event) ->\n return event.obj == 'milestone' && event.type == 'create'\n key: 'TIMELINE.MILESTONE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n },\n { # NewUsComment\n check: (timeline, event) ->\n return timeline.getIn(['data', 'comment']) && event.obj == 'userstory'\n key: 'TIMELINE.NEW_COMMENT_US',\n translate_params: ['username', 'obj_name'],\n description: (timeline) ->\n return $(timeline.getIn(['data', 'comment_html'])).text()\n },\n { # NewIssueComment\n check: (timeline, event) ->\n return timeline.getIn(['data', 'comment']) && event.obj == 'issue'\n key: 'TIMELINE.NEW_COMMENT_ISSUE',\n translate_params: ['username', 'obj_name'],\n description: (timeline) ->\n return $(timeline.getIn(['data', 'comment_html'])).text()\n },\n { # NewTaskComment\n check: (timeline, event) ->\n return timeline.getIn(['data', 'comment']) && event.obj == 'task'\n key: 'TIMELINE.NEW_COMMENT_TASK'\n translate_params: ['username', 'obj_name'],\n description: (timeline) ->\n return $(timeline.getIn(['data', 'comment_html'])).text()\n },\n { # UsMove\n check: (timeline, event) ->\n return timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'moveInBacklog' &&\n timeline.hasIn(['data', 'value_diff', 'value', 'backlog_order']) &&\n event.type == 'change'\n key: 'TIMELINE.US_MOVED',\n translate_params: ['username', 'obj_name']\n },\n { # UsToBacklog\n check: (timeline, event) ->\n if timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'moveInBacklog' &&\n event.type == 'change'\n\n return timeline.getIn(['data', 'value_diff', 'value', 'milestone']).get(1) == null\n\n return false\n key: 'TIMELINE.US_REMOVED_FROM_MILESTONE',\n translate_params: ['username', 'obj_name']\n },\n { # UsToMilestone\n check: (timeline, event) ->\n return timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'moveInBacklog' &&\n event.type == 'change'\n key: 'TIMELINE.US_ADDED_MILESTONE',\n translate_params: ['username', 'obj_name', 'sprint_name']\n },\n { # Blocked\n check: (timeline, event) ->\n if timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'blocked' &&\n event.type == 'change'\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) == true\n\n return false\n key: 'TIMELINE.BLOCKED',\n translate_params: ['username', 'obj_name'],\n description: (timeline) ->\n if timeline.hasIn(['data', 'value_diff', 'value', 'blocked_note_html'])\n return $(timeline.getIn(['data', 'value_diff', 'value', 'blocked_note_html']).get(1)).text()\n else\n return false\n },\n { # UnBlocked\n check: (timeline, event) ->\n if timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'blocked' &&\n event.type == 'change'\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) == false\n\n return false\n key: 'TIMELINE.UNBLOCKED',\n translate_params: ['username', 'obj_name']\n },\n { # MilestoneUpdated\n check: (timeline, event) ->\n return event.obj == 'milestone' && event.type == 'change'\n key: 'TIMELINE.MILESTONE_UPDATED',\n translate_params: ['username', 'obj_name']\n },\n { # WikiUpdated\n check: (timeline, event) ->\n return event.obj == 'wikipage' && event.type == 'change'\n key: 'TIMELINE.WIKI_UPDATED',\n translate_params: ['username', 'obj_name']\n },\n { # UsUpdated points\n check: (timeline, event) ->\n return event.obj == 'userstory' &&\n event.type == 'change' &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'points'\n key: 'TIMELINE.US_UPDATED_POINTS',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value', 'role_name']\n },\n { # UsUpdated description\n check: (timeline, event) ->\n return event.obj == 'userstory' &&\n event.type == 'change' &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'description_diff'\n key: 'TIMELINE.US_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n },\n { # UsUpdated general\n check: (timeline, event) ->\n return event.obj == 'userstory' &&\n event.type == 'change'\n key: 'TIMELINE.US_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n },\n { # IssueUpdated description\n check: (timeline, event) ->\n return event.obj == 'issue' &&\n event.type == 'change' &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'description_diff'\n key: 'TIMELINE.ISSUE_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n },\n { # IssueUpdated general\n check: (timeline, event) ->\n return event.obj == 'issue' &&\n event.type == 'change'\n key: 'TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n },\n { # TaskUpdated description\n check: (timeline, event) ->\n return event.obj == 'task' &&\n event.type == 'change' &&\n !timeline.getIn(['data', 'task', 'userstory']) &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'description_diff'\n key: 'TIMELINE.TASK_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n },\n { # TaskUpdated with US description\n check: (timeline, event) ->\n return event.obj == 'task' &&\n event.type == 'change' &&\n timeline.getIn(['data', 'task', 'userstory']) &&\n timeline.hasIn(['data', 'value_diff']) &&\n timeline.getIn(['data', 'value_diff', 'key']) == 'description_diff'\n key: 'TIMELINE.TASK_UPDATED_WITH_US',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name']\n },\n { # TaskUpdated general\n check: (timeline, event) ->\n return event.obj == 'task' &&\n event.type == 'change' &&\n !timeline.getIn(['data', 'task', 'userstory'])\n key: 'TIMELINE.TASK_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n },\n { # TaskUpdated with US\n check: (timeline, event) ->\n return event.obj == 'task' &&\n event.type == 'change' &&\n timeline.getIn(['data', 'task', 'userstory'])\n key: 'TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name', 'new_value']\n },\n { # New User\n check: (timeline, event) ->\n return event.obj == 'user' && event.type == 'create'\n key: 'TIMELINE.NEW_USER',\n translate_params: ['username']\n }\n ]\n\n return _.find types, (obj) ->\n return obj.check(timeline, event)\n\nclass UserTimelineType\n getType: (timeline, event) -> timelineType(timeline, event)\n\nangular.module(\"taigaUserTimeline\")\n .service(\"tgUserTimelineItemType\", UserTimelineType)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-item.directive.coffee\n###\n\nUserTimelineItemDirective = () ->\n return {\n templateUrl: \"user-timeline/user-timeline-item/user-timeline-item.html\"\n scope: {\n timeline: \"=tgUserTimelineItem\"\n }\n }\n\nangular.module(\"taigaUserTimeline\")\n .directive(\"tgUserTimelineItem\", UserTimelineItemDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline-pagination-sequence.service.coffee\n###\n\nUserTimelinePaginationSequence = () ->\n obj = {}\n\n obj.generate = (config) ->\n page = 1\n items = Immutable.List()\n\n config.minItems = config.minItems || 20\n\n next = () ->\n items = Immutable.List()\n return getContent()\n\n getContent = () ->\n config.fetch(page).then (response) ->\n page++\n\n data = response.get(\"data\")\n\n if config.filter\n data = config.filter(data)\n\n if config.map\n data = data.map(config.map)\n\n items = items.concat(data)\n\n if items.size < config.minItems && response.get(\"next\")\n return getContent()\n\n return Immutable.Map({\n items: items,\n next: response.get(\"next\")\n })\n\n return {\n next: () -> next()\n }\n\n return obj\n\nangular.module(\"taigaUserTimeline\").factory(\"tgUserTimelinePaginationSequenceService\", UserTimelinePaginationSequence)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/profile/profile-timeline/profile-timeline.controller.coffee\n###\n\ntaiga = @.taiga\n\nmixOf = @.taiga.mixOf\n\nclass UserTimelineController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin)\n @.$inject = [\n \"tgUserTimelineService\"\n ]\n\n constructor: (@userTimelineService) ->\n @.timelineList = Immutable.List()\n @.scrollDisabled = false\n\n @.timeline = null\n\n if @.projectId\n @.timeline = @userTimelineService.getProjectTimeline(@.projectId)\n else if @.currentUser\n @.timeline = @userTimelineService.getProfileTimeline(@.user.get(\"id\"))\n else\n @.timeline = @userTimelineService.getUserTimeline(@.user.get(\"id\"))\n\n loadTimeline: () ->\n @.scrollDisabled = true\n\n return @.timeline\n .next()\n .then (response) =>\n @.timelineList = @.timelineList.concat(response.get(\"items\"))\n\n if response.get(\"next\")\n @.scrollDisabled = false\n\n return @.timelineList\n\nangular.module(\"taigaUserTimeline\")\n .controller(\"UserTimeline\", UserTimelineController)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline.directive.coffee\n###\n\nUserTimelineDirective = ->\n return {\n templateUrl: \"user-timeline/user-timeline/user-timeline.html\",\n controller: \"UserTimeline\",\n controllerAs: \"vm\",\n scope: {\n projectId: \"=projectid\",\n user: \"=\",\n currentUser: \"=\"\n },\n bindToController: true\n }\n\nangular.module(\"taigaProfile\").directive(\"tgUserTimeline\", UserTimelineDirective)\n","###\n# Copyright (C) 2014-2015 Taiga Agile LLC \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: user-timeline.service.coffee\n###\n\ntaiga = @.taiga\n\nclass UserTimelineService extends taiga.Service\n @.$inject = [\n \"tgResources\",\n \"tgUserTimelinePaginationSequenceService\",\n \"tgUserTimelineItemType\",\n \"tgUserTimelineItemTitle\"\n ]\n\n constructor: (@rs, @userTimelinePaginationSequenceService, @userTimelineItemType, @userTimelineItemTitle) ->\n\n _valid_fields: [\n 'status',\n 'subject',\n 'description_diff',\n 'assigned_to',\n 'points',\n 'severity',\n 'priority',\n 'type',\n 'attachments',\n 'is_iocaine',\n 'content_diff',\n 'name',\n 'estimated_finish',\n 'estimated_start',\n # customs\n 'blocked',\n 'moveInBacklog',\n 'milestone'\n ]\n\n _invalid: [\n {# Items with only invalid fields\n check: (timeline) ->\n value_diff = timeline.get(\"data\").get(\"value_diff\")\n\n if value_diff\n fieldKey = value_diff.get('key')\n\n if @._valid_fields.indexOf(fieldKey) == -1\n return true\n else if fieldKey == 'attachments' &&\n value_diff.get('value').get('new').size == 0\n return true\n\n return false\n },\n {# Deleted\n check: (timeline) ->\n event = timeline.get('event_type').split(\".\")\n return event[2] == 'delete'\n },\n {# Project change\n check: (timeline) ->\n event = timeline.get('event_type').split(\".\")\n return event[1] == 'project' && event[2] == 'change'\n },\n {# Comment deleted\n check: (timeline) ->\n return !!timeline.get(\"data\").get(\"comment_deleted\")\n },\n {# Task milestone\n check: (timeline) ->\n event = timeline.get('event_type').split(\".\")\n value_diff = timeline.get(\"data\").get(\"value_diff\")\n\n if value_diff &&\n event[1] == \"task\" &&\n event[2] == \"change\" &&\n value_diff.get(\"key\") == \"milestone\"\n return timeline.get(\"data\").get(\"value_diff\").get(\"value\")\n\n return false\n }\n ]\n\n _isInValidTimeline: (timeline) ->\n return _.some @._invalid, (invalid) =>\n return invalid.check.call(this, timeline)\n\n _parseEventType: (event_type) ->\n event_type = event_type.split(\".\")\n\n return {\n section: event_type[0],\n obj: event_type[1],\n type: event_type[2]\n }\n\n _getTimelineObject: (timeline, event) ->\n if timeline.get('data').get(event.obj)\n return timeline.get('data').get(event.obj)\n\n _attachExtraInfoToTimelineEntry: (timeline, event, type) ->\n title = @userTimelineItemTitle.getTitle(timeline, event, type)\n\n timeline = timeline.set('title_html', title)\n\n timeline = timeline.set('obj', @._getTimelineObject(timeline, event))\n\n if type.description\n timeline = timeline.set('description', type.description(timeline))\n\n if type.member\n timeline = timeline.set('member', type.member(timeline))\n\n if timeline.getIn(['data', 'value_diff', 'key']) == 'attachments' &&\n timeline.hasIn(['data', 'value_diff', 'value', 'new'])\n timeline = timeline.set('attachments', timeline.getIn(['data', 'value_diff', 'value', 'new']))\n\n return timeline\n\n # - create a entry per every item in the values_diff\n _parseTimeline: (response) ->\n newdata = Immutable.List()\n\n response.get('data').forEach (item) =>\n event = @._parseEventType(item.get('event_type'))\n\n data = item.get('data')\n values_diff = data.get('values_diff')\n\n if values_diff && values_diff.count()\n # blocked/unblocked change must be a single change\n if values_diff.has('is_blocked')\n values_diff = Immutable.Map({'blocked': values_diff})\n\n if values_diff.has('milestone')\n values_diff = Immutable.Map({'moveInBacklog': values_diff})\n else if event.obj == 'milestone'\n values_diff = Immutable.Map({'milestone': values_diff})\n\n values_diff.forEach (value, key) =>\n obj = Immutable.Map({\n key: key,\n value: value\n })\n\n newItem = item.setIn(['data', 'value_diff'], obj)\n newItem = newItem.deleteIn(['data', 'values_diff'])\n newdata = newdata.push(newItem)\n else\n newItem = item.deleteIn(['data', 'values_diff'])\n newdata = newdata.push(newItem)\n\n return response.set('data', newdata)\n\n _addEntyAttributes: (item) ->\n event = @._parseEventType(item.get('event_type'))\n type = @userTimelineItemType.getType(item, event)\n\n return @._attachExtraInfoToTimelineEntry(item, event, type)\n\n getProfileTimeline: (userId) ->\n config = {}\n\n config.fetch = (page) =>\n return @rs.users.getProfileTimeline(userId, page)\n .then (response) =>\n return @._parseTimeline(response)\n\n config.map = (obj) => @._addEntyAttributes(obj)\n\n config.filter = (items) =>\n return items.filterNot (item) => @._isInValidTimeline(item)\n\n return @userTimelinePaginationSequenceService.generate(config)\n\n getUserTimeline: (userId) ->\n config = {}\n\n config.fetch = (page) =>\n return @rs.users.getUserTimeline(userId, page)\n .then (response) =>\n return @._parseTimeline(response)\n\n config.map = (obj) => @._addEntyAttributes(obj)\n\n config.filter = (items) =>\n return items.filterNot (item) => @._isInValidTimeline(item)\n\n return @userTimelinePaginationSequenceService.generate(config)\n\n getProjectTimeline: (projectId) ->\n config = {}\n\n config.fetch = (page) =>\n return @rs.projects.getTimeline(projectId, page)\n .then (response) => return @._parseTimeline(response)\n\n config.map = (obj) => @._addEntyAttributes(obj)\n\n config.filter = (items) =>\n return items.filterNot (item) => @._isInValidTimeline(item)\n\n return @userTimelinePaginationSequenceService.generate(config)\n\nangular.module(\"taigaUserTimeline\").service(\"tgUserTimelineService\", UserTimelineService)\n","###\n# Copyright (C) 2014-2015 Andrey Antukh \n# Copyright (C) 2014-2015 Jesús Espino Garcia \n# Copyright (C) 2014-2015 David Barragán Merino \n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License as\n# published by the Free Software Foundation, either version 3 of the\n# License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see .\n#\n# File: modules/backlog.coffee\n###\n\nmodule = angular.module(\"taigaPlugins\", [\"ngRoute\"])\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/dist/js/templates.js b/dist/js/templates.js index 12030cc..522a1fe 100644 --- a/dist/js/templates.js +++ b/dist/js/templates.js @@ -6,7 +6,7 @@ $templateCache.put("admin/admin-project-export.html","\n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n \n \n \n
\n
\n
\n \n
\n
\n
"); $templateCache.put("admin/admin-project-profile.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n

\n

\n
\n
\n
"); $templateCache.put("admin/admin-project-reports.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n

\n
\n

\n
\n
\n
\n
\n
\n
"); -$templateCache.put("admin/admin-project-values-custom-fields.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n

{{ customFieldSectionTitle | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ attr.name }}
\n
{{ attr.description }}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{ customFieldSectionTitle | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ attr.name }}
\n
{{ attr.description }}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{ customFieldSectionTitle | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ attr.name }}
\n
{{ attr.description }}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"); +$templateCache.put("admin/admin-project-values-custom-fields.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n

{{ customFieldSectionTitle | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ attr.name }}
\n
{{ attr.description }}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{ customFieldSectionTitle | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ attr.name }}
\n
{{ attr.description }}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{ customFieldSectionTitle | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ attr.name }}
\n
{{ attr.description }}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"); $templateCache.put("admin/admin-project-values-points.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n

{{sectionName | translate}}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ value.name }}
\n
{{ value.value }}
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
"); $templateCache.put("admin/admin-project-values-priorities.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n

{{ sectionName | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ value.name }}
\n
\n
\n
\n
\n
\n
\n
    \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
    \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
"); $templateCache.put("admin/admin-project-values-severities.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n

{{ sectionName | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ value.name }}
\n
\n
\n
\n
\n
\n
\n
    \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
    \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
"); @@ -22,12 +22,12 @@ $templateCache.put("admin/project-csv.html","\n
\" title=\"<%- title %>\" target=\"_blank\" download=\"<%- name %>\"><%- name %>
\n
<%- size %>
\n
\n \" placeholder=\"{{\'ATTACHMENT.DESCRIPTION\' | translate}}\"/>\n
\n
\n -is-deprecated\"/>\n \n
\n
"); $templateCache.put("attachment/attachment.html","\n\n
<%- size %>
\n
<% if (isDeprecated){ %>{{\'ATTACHMENT.DEPRECATED\' | translate}}<% } %><%- description %>
<% if (modifyPermission) {%>\n
<% } %>"); $templateCache.put("attachment/attachments.html","\n
\n
\n

\n
\" title=\"{{\'ATTACHMENT.ADD\' | translate}}\" class=\"add-attach\"><% if (maxFileSize){ %>\'}\" class=\"size-info hidden\"><% }; %>\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"); -$templateCache.put("auth/change-password-from-recovery.html","\n
\n
\n
\n

\"TAIGA\"

\n

\n
\n


\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
"); -$templateCache.put("auth/forgot-password.html","\n
\n
\n
\"TAIGA\"\n

Taiga

\n

\n
\n


\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
"); +$templateCache.put("auth/change-password-from-recovery.html","\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n
\n


\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
"); +$templateCache.put("auth/forgot-password.html","\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n
\n


\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
"); $templateCache.put("auth/invitation.html","\n
\n
\n
\n

\n

\n
\n
\n

\n
\n \n
\n
\n \n \n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
"); $templateCache.put("auth/login-text.html","\n

 \" tg-nav=\"register\" title=\"{{"AUTH.REGISTER" | translate}}\" translate=\"AUTH.CREATE_ACCOUNT\">

"); -$templateCache.put("auth/login.html","\n
\n
\n
\n
\"TAIGA\"\n

Taiga

\n

\n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
"); -$templateCache.put("auth/register.html","\n
\n
\n
\"TAIGA\"\n

Taiga

\n

\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
"); +$templateCache.put("auth/login.html","\n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n

\n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
"); +$templateCache.put("auth/register.html","\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
"); $templateCache.put("backlog/backlog.html","\n
\n \n \n
\n
\n

\n
\n
\n \n
\n
\n
\n
\n

\n
\n
    \n
  • \n
  • \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
--
\n
--
\n
--
\n
--
\n
\n\n \n \n \n\n\n
\n
\n
\n
\n\n \n \n \n\n\n
\n
\n

\n

{{\'BACKLOG.CUSTOMIZE_GRAPH_TEXT\' | translate}} {{\'BACKLOG.CUSTOMIZE_GRAPH_ADMIN\' | translate}}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
{{ ::us.total_voters }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"{{\'BACKLOG.EMPTY\'\n

\n
\n
\n \n
\n
\n

\n \n\n\n
\n
\"{{\'BACKLOG.SPRINTS.EMPTY\'\n

\n
\n
\n
\n
\n
\n
{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n

\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
"); $templateCache.put("backlog/filter-selected.html","<% _.each(filters, function(f) { %>\" data-id=\"<%- f.id %>\" class=\"single-filter selected\">\" class=\"name\"><%- f.name %><% }) %>"); $templateCache.put("backlog/filters.html","\n<% _.each(filters, function(f) { %>\n<% if (f.selected) { %>\" data-id=\"<%- f.id %>\" class=\"single-filter active\">\" class=\"name\"><%- f.name %><% if (f.count){ %><%- f.count %><% } %><% } else { %>\" data-id=\"<%- f.id %>\" class=\"single-filter\">\" class=\"name\"><%- f.name %><% if (f.count){ %><%- f.count %><% } %><% } %>\n<% }) %>"); @@ -63,7 +63,7 @@ $templateCache.put("task/related-task-row-edit.html","\n
\n $templateCache.put("task/related-task-row.html","\n
\n
<%- task.subject %>\" class=\"clickable\">#<%- task.ref %> <%- task.subject %>\n
<% if(perms.modify_task) { %><% } %>\n <% if(perms.delete_task) { %><% } %>\n
\n
\n
\n\n
\n
\n
<% if(perms.modify_task) { %><% } %>\n
\n
"); $templateCache.put("task/task-detail.html","\n
\n \n
\n
\n
\n

\n
\n
\n
\n
\n
\n \n
\n

\n \n

{{ \"TASK.ORIGIN_US\"| translate }}{{ task.external_reference[1] }}

\n

\n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n
"); $templateCache.put("taskboard/taskboard-user.html","\n
\n
"); -$templateCache.put("taskboard/taskboard.html","\n
\n \n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n \n \n\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n

\n
\n
\n
\n
\n
\n
\n

\n

\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{\'TASKBOARD.PLACEHOLDER_CARD_TITLE\' | translate}}

\n

{{\'TASKBOARD.PLACEHOLDER_CARD_TEXT\' | translate}}

\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{\'TASKBOARD.PLACEHOLDER_CARD_TITLE\' | translate}}

\n

{{\'TASKBOARD.PLACEHOLDER_CARD_TEXT\' | translate}}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n

\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n \n
\n
\n
\n
\n
"); +$templateCache.put("taskboard/taskboard.html","\n
\n \n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n \n \n\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n

\n
\n
\n
\n
\n
\n
\n

\n

\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{\'TASKBOARD.PLACEHOLDER_CARD_TITLE\' | translate}}

\n

{{\'TASKBOARD.PLACEHOLDER_CARD_TEXT\' | translate}}

\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{\'TASKBOARD.PLACEHOLDER_CARD_TITLE\' | translate}}

\n

{{\'TASKBOARD.PLACEHOLDER_CARD_TEXT\' | translate}}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n

\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n \n
\n
\n
\n
\n
"); $templateCache.put("team/leave-project.html","{{ \'TEAM.ACTION_LEAVE_PROJECT\' | translate }}"); $templateCache.put("team/team-filter.html","\n
    \n
  • \n
  • \n
"); $templateCache.put("team/team-member-current-user.html","\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"); @@ -75,8 +75,8 @@ $templateCache.put("us/us-detail.html","\n
clickable<% }%>\">\" class=\"level\"><%- status.name %><% if(editable){ %><% }%>\n \n
"); $templateCache.put("us/us-task-progress.html","\n
\n
"); $templateCache.put("us/us-team-requirement-button.html","\n\n"); -$templateCache.put("user/cancel-account.html","\n
\n
\n
\n

\"TAIGA\"

\n

\n
\n

\n

\n
\n
\n \n \n
\n
\n
\n
\n
\n
"); -$templateCache.put("user/change-email.html","\n
\n
\n
\n

\"TAIGA\"

\n

\n
\n

\n

\n
\n
\n \n \n
\n
\n
\n
\n
\n
"); +$templateCache.put("user/cancel-account.html","\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n

\n
\n

\n

\n
\n
\n \n \n
\n
\n
\n
\n
\n
"); +$templateCache.put("user/change-email.html","\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n
\n

\n

\n
\n
\n \n \n
\n
\n
\n
\n
\n
"); $templateCache.put("user/mail-notifications.html","\n
\n \n \n
\n \n
\n
\n
\n
\n

{{sectionName | translate}}

\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"); $templateCache.put("user/user-change-password.html","\n
\n \n \n
\n \n
\n
\n
\n
\n

{{sectionName | translate}}

\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n
"); $templateCache.put("user/user-profile.html","\n
\n \n
\n \n
\n
\n
\n
\n

{{sectionName | translate}}

\n
\n
\n
\n
\n
\n
\"avatar\"\n
\"{{\'COMMON.LOADING\'
\n
\n \n

\n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
"); diff --git a/dist/locales/locale-ca.json b/dist/locales/locale-ca.json index 72fb43d..a4108be 100644 --- a/dist/locales/locale-ca.json +++ b/dist/locales/locale-ca.json @@ -156,7 +156,7 @@ "TITLE_LIGHTBOX_DELETE_WARTCHER": "Esborrar seguidor..." }, "WATCH_BUTTON": { - "WATCH": "Watch", + "WATCH": "Segueix", "WATCHING": "Observant", "UNWATCH": "Unwatch", "WATCHERS": "Watchers", @@ -328,7 +328,7 @@ "PLACEHOLDER_NEW_PASSWORD": "nova contrasenya", "PLACEHOLDER_RE_TYPE_NEW_PASSWORD": "Reescriu la nova contrasenya", "ACTION_RESET_PASSWORD": "Resetejar contrasenya", - "ERROR": "Our Oompa Loompas can't find your request to recover your password. Try to ask for it again.", + "ERROR": "Els Oompa Loompas no troben el teu password. Per favor intenta-ho de nou.", "SUCCESS": "Els Oompa Loompas han salvat la teua contrasenya
Prova a entrar amb ella." }, "INVITATION": { @@ -343,8 +343,8 @@ "HOME": { "PAGE_TITLE": "Home - Taiga", "PAGE_DESCRIPTION": "La home de Taiga amb els teus projectes principals, totes les històries d'usuari, tasques i incidències que tens assignades i aquelles que estàs Watching", - "EMPTY_WORKING_ON": "It feels empty, doesn't it? Start working with Taiga and you'll see here the stories, tasks and issues you are workin on.", - "EMPTY_WATCHING": "Follow User Stories, Tasks, Issues... that you want to know about :)", + "EMPTY_WORKING_ON": "Sembla buit, no? Comenceu a treballar amb Taiga i voràs ací les históries, tasques e incidències en les que estás treballant.", + "EMPTY_WATCHING": "Segueix les históries, tasques e incidéncies...que vols tindre en compte :)", "EMPTY_PROJECT_LIST": "No tens cap projecte encara", "WORKING_ON_SECTION": "En Progrés", "WATCHING_SECTION": "Observant" @@ -436,8 +436,8 @@ "PROJECT_DETAILS": "Detalls de projecte", "PROJECT_NAME": "Nom del projecte", "PROJECT_SLUG": "Slug de projecte", - "NUMBER_SPRINTS": "Number of sprints (0 for an undetermined quantity)", - "NUMBER_US_POINTS": "Number of US points (0 for an undetermined quantity)", + "NUMBER_SPRINTS": "Nombre d'sprints (0 per a quantitat indetermindad)", + "NUMBER_US_POINTS": "Nombre de punts d'històries (0 per a una quantitat indeterminada)", "TAGS": "Etiquetes", "DESCRIPTION": "Descripció", "PUBLIC_PROJECT": "Projecte públic", @@ -447,7 +447,7 @@ "REPORTS": { "TITLE": "Informes", "SUBTITLE": "Exporta les dades del teu projecte en CSV i fes els teus propis informes.", - "DESCRIPTION": "Download a CSV file or copy the generated URL and open it in your favourite text editor or spreadsheet to make your own project data reports. You will be able to visualize and analyze all your data easily.", + "DESCRIPTION": "Descarrega un arxiu CSV o copia la URL generada i obrila en el teu editor de text o fulla de cálcul per a poder crear els teus propi informes. Podrás vore i analitzar totes les teues dades fàcilment.", "HELP": "Com utilitzar açó a la meu fulla de càlcul?", "REGENERATE_TITLE": "Canviar URL", "REGENERATE_SUBTITLE": "Vas a canviar la URL d'accés al CSV. La URL previa no funcionarà. Estàs segur?" @@ -476,7 +476,7 @@ "FIELD_TYPE_DATE": "Data" }, "PROJECT_VALUES": { - "PAGE_TITLE": "{{sectionName}} - Project values - {{projectName}}", + "PAGE_TITLE": "{{sectionName}} - Valors de projecte - {{projectName}}", "REPLACEMENT": "Tots els elements amb aquest valor seràn canviats a", "ERROR_DELETE_ALL": "No pots esborrar tots els valors." }, @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Cancel·la la creació", "SET_FIELD_NAME": "Escriu el nom del camp personalitzat", "SET_FIELD_DESCRIPTION": "Escriu la descripció del camp personalitzat", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Actualitza el camp personalitzat", "ACTION_CANCEL_EDITION": "Cancel·la la edició" }, @@ -665,7 +666,7 @@ "REPORT": "Informar d'un abús", "TABS": { "ACTIVITY_TAB": "Activitat", - "ACTIVITY_TAB_TITLE": "Show all the activity of this user", + "ACTIVITY_TAB_TITLE": "Mostra tota la activitat d'aquest usuari", "PROJECTS_TAB": "Projectes", "PROJECTS_TAB_TITLE": "List all projects that this user is a member", "LIKES_TAB": "Likes", @@ -681,20 +682,20 @@ "PROFILE_SIDEBAR": { "TITLE": "El teu perfil", "DESCRIPTION": "La gent pot vore tot el que fas i en qué estàs treballant. Afegix una bio interessant per a donar una millor versió de la teua informació.", - "ADD_INFO": "Edit bio" + "ADD_INFO": "Edita la bio" }, "PROFILE_FAVS": { - "FILTER_INPUT_PLACEHOLDER": "Type something...", + "FILTER_INPUT_PLACEHOLDER": "Escriu algo...", "FILTER_TYPE_ALL": "Tot", - "FILTER_TYPE_ALL_TITLE": "Show all", + "FILTER_TYPE_ALL_TITLE": "Mostrar tot", "FILTER_TYPE_PROJECTS": "Projectes", - "FILTER_TYPE_PROJECT_TITLES": "Show only projects", - "FILTER_TYPE_USER_STORIES": "Stories", - "FILTER_TYPE_USER_STORIES_TITLES": "Show only user stories", + "FILTER_TYPE_PROJECT_TITLES": "Mostra només projectes", + "FILTER_TYPE_USER_STORIES": "Históries", + "FILTER_TYPE_USER_STORIES_TITLES": "Veure només històries d'usuari", "FILTER_TYPE_TASKS": "Tasques", - "FILTER_TYPE_TASK_TITLES": "Show only tasks", + "FILTER_TYPE_TASK_TITLES": "Mostra només tasquest", "FILTER_TYPE_ISSUES": "Incidències", - "FILTER_TYPE_ISSUES_TITLE": "Show only issues", + "FILTER_TYPE_ISSUES_TITLE": "Mostra només incidències", "EMPTY_TITLE": "It looks like there's nothing to show here." } }, @@ -754,7 +755,7 @@ }, "IMPORT": { "TITLE": "Important Projecte", - "UPLOADING_FILE": "Uploading dump file", + "UPLOADING_FILE": "Pujant arxiu de dades", "DESCRIPTION": "Aquest procés pot durar una mica, pero favor mantinga la finestra oberta", "ASYNC_IN_PROGRESS_TITLE": "Els Oompa Loompas estàn important el teu projecte", "ASYNC_IN_PROGRESS_MESSAGE": "Aquest procés pot durar uns moments
T'enviarem un correo quan estiga llest.", @@ -766,15 +767,15 @@ "SYNC_SUCCESS": "El teu projecte s'ha importat correctament" }, "LIKE_BUTTON": { - "LIKE": "Like", - "LIKED": "Liked", - "UNLIKE": "Unlike", + "LIKE": "M'agrada", + "LIKED": "T'agrada", + "UNLIKE": "No t'agrada", "BUTTON_TITLE": "Like or unlike this project", "COUNTER_TITLE": "{total, plural, one{one fan} other{# fans}}" }, "WATCH_BUTTON": { - "BUTTON_TITLE": "Watch this project and set notification policy", - "WATCH": "Watch", + "BUTTON_TITLE": "Segueix este projecte i edita les notificacions", + "WATCH": "Segueix", "WATCHING": "Observant", "COUNTER_TITLE": "{total, plural, one{one watcher} other{# watchers}}", "OPTIONS": { @@ -857,7 +858,7 @@ "SECTION_NAME": "Detalls de la història d'usuari", "LINK_TASKBOARD": "Panell de tasques", "TITLE_LINK_TASKBOARD": "Anar a panell de tasques", - "TOTAL_POINTS": "total points", + "TOTAL_POINTS": "punts totals", "ADD": "+ Afegeix una nova història d'usuari", "ADD_BULK": "Afegeix noves històries d'usuari en grup", "PROMOTED": "Aquesta US ha sigut promocionada desde:", @@ -944,8 +945,8 @@ "PAGE_TITLE": "Backlog - {{projectName}}", "PAGE_DESCRIPTION": "El panell Backlog, amb històries d'usuari i esprints del projecte {{projectName}}: {{projectDescription}}", "SECTION_NAME": "Backlog", - "CUSTOMIZE_GRAPH": "Customize your backlog graph", - "CUSTOMIZE_GRAPH_TEXT": "To have a nice graph that helps you follow the evolution of the project you have to set up the points and sprints through the", + "CUSTOMIZE_GRAPH": "Edita el teu gràfic de backlog", + "CUSTOMIZE_GRAPH_TEXT": "Per a tindre un gràfic que t'ajude a seguir la evolució del projecte deus de editar els punts i els sprints per mig del", "CUSTOMIZE_GRAPH_ADMIN": "Admin", "CUSTOMIZE_GRAPH_TITLE": "Set up the points and sprints through the Admin", "MOVE_US_TO_CURRENT_SPRINT": "Envia al Sprint", @@ -1024,12 +1025,12 @@ "NOT_FOUND": "No trobat", "NOT_FOUND_TEXT": "Error 404. La pàgina que busques no existeix. Pots tornar a la página principal de taiga i provar desde allí.", "PERMISSION_DENIED": "Permis denegat", - "PERMISSION_DENIED_TEXT": "You don't have permission to access to this page.", + "PERMISSION_DENIED_TEXT": "No tens permissos per a accedir a esta pàgina.", "VERSION_ERROR": "Algú dins de Taiga ha canviat aȯ abans i els Oompa Loompas no pode aplicar els teus canvis. Per favor recarrega i aplica els teus canvis (es perdràn)" }, "TASKBOARD": { "PAGE_TITLE": "{{sprintName}} - Panell de tasques del esprint - {{projectName}}", - "PAGE_DESCRIPTION": "Sprint {{sprintName}} (from {{startDate}} to {{endDate}}) of {{projectName}}. Completed {{completedPercentage}}% ({{completedPoints}} of {{totalPoints}} points). {{openTasks}} opened tasks of {{totalTasks}}.", + "PAGE_DESCRIPTION": "Sprint {{sprintName}} (from {{startDate}} to {{endDate}}) de {{projectName}}. Completat {{completedPercentage}}% ({{completedPoints}} de {{totalPoints}} points). {{openTasks}} tasques obertes de {{totalTasks}}.", "SECTION_NAME": "Panell de tasques", "TITLE_ACTION_ADD": "Afegir nova tasca", "TITLE_ACTION_ADD_BULK": "Afegeix noves històries d'usuari en grup", @@ -1055,7 +1056,7 @@ } }, "TASK": { - "PAGE_TITLE": "{{taskSubject}} - Task {{taskRef}} - {{projectName}}", + "PAGE_TITLE": "{{taskSubject}} - Tasca {{taskRef}} - {{projectName}}", "PAGE_DESCRIPTION": "Estat: {{taskStatus }}. Descripció: {{taskDescription}}", "SECTION_NAME": "Detalls de la tasca", "LINK_TASKBOARD": "Panell de tasques", @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "El teu projecte", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "En Progrés", diff --git a/dist/locales/locale-de.json b/dist/locales/locale-de.json index 803a8a6..0437155 100644 --- a/dist/locales/locale-de.json +++ b/dist/locales/locale-de.json @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Erstellung abbrechen", "SET_FIELD_NAME": "Legen Sie den Namen Ihres benutzerdefinierten Feldes fest", "SET_FIELD_DESCRIPTION": "Legen Sie Ihre Beschreibung für das benutzerdefinierte Feld fest", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Benutzerdefiniertes Feld aktualisieren", "ACTION_CANCEL_EDITION": "Bearbeitung abbrechen" }, @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Ihr Projekt", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "Zuletzt bearbeitet", diff --git a/dist/locales/locale-en.json b/dist/locales/locale-en.json index c959212..30defbb 100644 --- a/dist/locales/locale-en.json +++ b/dist/locales/locale-en.json @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Cancel creation", "SET_FIELD_NAME": "Set your custom field name", "SET_FIELD_DESCRIPTION": "Set your custom field description", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Update Custom Field", "ACTION_CANCEL_EDITION": "Cancel edition" }, @@ -1359,7 +1360,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Your project", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "Working on", diff --git a/dist/locales/locale-es.json b/dist/locales/locale-es.json index f19c8c3..bd86d6f 100644 --- a/dist/locales/locale-es.json +++ b/dist/locales/locale-es.json @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Cancelar la creación", "SET_FIELD_NAME": "Escribe el nombre del atributo personalizado", "SET_FIELD_DESCRIPTION": "Escribe una descripción para el atributo personalizado", + "FIELD_TYPE_DEFAULT": "-- elige uno --", "ACTION_UPDATE": "Actualizar Atributo Personalizado", "ACTION_CANCEL_EDITION": "Cancelar edición" }, @@ -590,7 +591,7 @@ "STATUS_ACTIVE": "Activado", "STATUS_PENDING": "Pendiente", "DELETE_MEMBER": "Borrar miembro", - "RESEND": "Resend", + "RESEND": "Enviar de nuevo", "SUCCESS_SEND_INVITATION": "Hemos enviado nuevamente la invitación a '{{email}}'.", "ERROR_SEND_INVITATION": "No hemos enviado la invitación.", "SUCCESS_DELETE": "Hemos eliminado {{message}}.", @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Su proyecto", - "TEXT": "Bienvenido! Aquí encontrarás los proyectos en los que estás participando. Te hemos dejado plantillas con proyectos de ejemplo para ayudarte a descubrir el poder de Taiga." + "TEXT": "¡Bienvenido! Aquí encontrarás los proyectos en los que participas." }, "STEP2": { "TITLE": "Trabajando en", diff --git a/dist/locales/locale-fi.json b/dist/locales/locale-fi.json index 214b368..e561cc2 100644 --- a/dist/locales/locale-fi.json +++ b/dist/locales/locale-fi.json @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Peru luonti", "SET_FIELD_NAME": "Anna oman kentän nimi", "SET_FIELD_DESCRIPTION": "Anna oman kenttäsi kuvaus", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Päivitä oma kenttä", "ACTION_CANCEL_EDITION": "Peru versio" }, @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Projektisi", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "Working on", diff --git a/dist/locales/locale-fr.json b/dist/locales/locale-fr.json index d76d0ea..7182286 100644 --- a/dist/locales/locale-fr.json +++ b/dist/locales/locale-fr.json @@ -156,7 +156,7 @@ "TITLE_LIGHTBOX_DELETE_WARTCHER": "Supprimer l'observateur..." }, "WATCH_BUTTON": { - "WATCH": "Watch", + "WATCH": "Suivre", "WATCHING": "Observant", "UNWATCH": "Unwatch", "WATCHERS": "Watchers", @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Annuler la création", "SET_FIELD_NAME": "Saisissez le nom du champ personnalisé", "SET_FIELD_DESCRIPTION": "Entrez la description de votre champ personnalisé", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Mettre à jour le champ personnalisé", "ACTION_CANCEL_EDITION": "Annuler l'édition" }, @@ -665,7 +666,7 @@ "REPORT": "Signaler un abus", "TABS": { "ACTIVITY_TAB": "Activité", - "ACTIVITY_TAB_TITLE": "Show all the activity of this user", + "ACTIVITY_TAB_TITLE": "Voir toutes les activités de cet utilisateur", "PROJECTS_TAB": "Projets", "PROJECTS_TAB_TITLE": "List all projects that this user is a member", "LIKES_TAB": "Likes", @@ -774,11 +775,11 @@ }, "WATCH_BUTTON": { "BUTTON_TITLE": "Watch this project and set notification policy", - "WATCH": "Watch", + "WATCH": "Suivre", "WATCHING": "Observant", "COUNTER_TITLE": "{total, plural, one{one watcher} other{# watchers}}", "OPTIONS": { - "NOTIFY_ALL": "Receive all notifications", + "NOTIFY_ALL": "Recevoir toutes les notifications", "NOTIFY_ALL_TITLE": "Receive all notifications for this project", "NOTIFY_INVOLVED": "Only involved", "NOTIFY_INVOLVED_TITLE": "Recive notificacions only when you are involved", @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Votre projet", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "Projets en cours", @@ -1375,7 +1376,7 @@ }, "BACKLOG": { "STEP1": { - "TITLE": "Project summary", + "TITLE": "Résumé du projet", "TEXT1": "Here you will see the state of your project.", "TEXT2": "You can change every kind of project settings through the admin." }, diff --git a/dist/locales/locale-it.json b/dist/locales/locale-it.json index 8c4e02b..6b28825 100644 --- a/dist/locales/locale-it.json +++ b/dist/locales/locale-it.json @@ -336,14 +336,14 @@ "PAGE_DESCRIPTION": "Accetta l'invito a partecipare ad un progetto in Taiga, una piattaforma semplice di project management che rende il lavoro davvero piacevole a start-up e a chi sviluppa e progetta con il metodo \"agile\"." }, "INVITATION_LOGIN_FORM": { - "NOT_FOUND": "Our Oompa Loompas can't find your invitation.", + "NOT_FOUND": "I nostri Digital Champions non hanno trovato il tuo invito.", "SUCCESS": "Sei ora un membro di questo progetto. Benvenuto in {{project_name}}", "ERROR": "Secondo i nostri Digital Champions, non sei ancora regisrtrato o hai inserito una password non valida." }, "HOME": { "PAGE_TITLE": "Home - Taiga", - "PAGE_DESCRIPTION": "La home di Taiga con i tuoi principali progetti e tutti ile storie utente, compiti e problemi assegnati e osservati. ", - "EMPTY_WORKING_ON": "It feels empty, doesn't it? Start working with Taiga and you'll see here the stories, tasks and issues you are workin on.", + "PAGE_DESCRIPTION": "La home di Taiga con i tuoi principali progetti e tutte le storie utente, i compiti e problemi assegnati e osservati. ", + "EMPTY_WORKING_ON": "Dà un po' l'idea di vuoto, no? Inizia a lavorare con Taiga e qui vedrai le storie, i compiti ed i problemi su cui stai lavorando.", "EMPTY_WATCHING": "Follow User Stories, Tasks, Issues... that you want to know about :)", "EMPTY_PROJECT_LIST": "Per ora non hai nessun progetto", "WORKING_ON_SECTION": "Sta lavorando su", @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Elimina la creazione", "SET_FIELD_NAME": "Imposta il nome del campo predefinito", "SET_FIELD_DESCRIPTION": "Imposta la descrizione del campo personalizzato ", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Aggiorna il campo personalizzato", "ACTION_CANCEL_EDITION": "Elimina versione" }, @@ -694,7 +695,7 @@ "FILTER_TYPE_TASKS": "Compiti", "FILTER_TYPE_TASK_TITLES": "Mostra solo attività", "FILTER_TYPE_ISSUES": "problemi", - "FILTER_TYPE_ISSUES_TITLE": "Show only issues", + "FILTER_TYPE_ISSUES_TITLE": "Mostra solo i problemi", "EMPTY_TITLE": "It looks like there's nothing to show here." } }, @@ -769,7 +770,7 @@ "LIKE": "Mi piace", "LIKED": "Liked", "UNLIKE": "Non mi piace", - "BUTTON_TITLE": "Like or unlike this project", + "BUTTON_TITLE": "Vota a favore o a sfavore di questo progetto", "COUNTER_TITLE": "{total, plural, one{one fan} other{# fans}}" }, "WATCH_BUTTON": { @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Your project", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "Sta lavorando su", diff --git a/dist/locales/locale-nl.json b/dist/locales/locale-nl.json index 44df576..9f913ac 100644 --- a/dist/locales/locale-nl.json +++ b/dist/locales/locale-nl.json @@ -156,7 +156,7 @@ "TITLE_LIGHTBOX_DELETE_WARTCHER": "Verwijder waarnemer..." }, "WATCH_BUTTON": { - "WATCH": "Watch", + "WATCH": "Bekijk", "WATCHING": "Volgers", "UNWATCH": "Unwatch", "WATCHERS": "Watchers", @@ -336,7 +336,7 @@ "PAGE_DESCRIPTION": "Accepteer de uitnodiging voor een project in Taiga, een project management platform voor startups en agile ontwikkelaars & designers die een simpele, mooie tool willen om werken echt leuk te maken." }, "INVITATION_LOGIN_FORM": { - "NOT_FOUND": "Our Oompa Loompas can't find your invitation.", + "NOT_FOUND": "Onze Oompa Loompa's kunnen je uitnodiging niet vinden.", "SUCCESS": "Je bent met succes toegetreden tot dit project, Welkom bij {{project_name}}", "ERROR": "Volgens onze Oempa-Loempa's, ben je nog niet geregistreerd of heb je een fout wachtwoord getypt." }, @@ -436,8 +436,8 @@ "PROJECT_DETAILS": "Project details", "PROJECT_NAME": "Naam project", "PROJECT_SLUG": "Project Slug", - "NUMBER_SPRINTS": "Number of sprints (0 for an undetermined quantity)", - "NUMBER_US_POINTS": "Number of US points (0 for an undetermined quantity)", + "NUMBER_SPRINTS": "Aantal sprinten (0 voor een onbepaalde hoeveelheid)", + "NUMBER_US_POINTS": "Aantal US punten (0 voor een onbepaalde hoeveelheid)", "TAGS": "Tags", "DESCRIPTION": "Beschrijving", "PUBLIC_PROJECT": "Open project", @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Annuleer aanmaken", "SET_FIELD_NAME": "Stel de naam van je eigen veld in", "SET_FIELD_DESCRIPTION": "Eigen veld omschrijving instellen", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Eigen veld bijwerken", "ACTION_CANCEL_EDITION": "Editie annuleren" }, @@ -665,11 +666,11 @@ "REPORT": "Meld misbruik", "TABS": { "ACTIVITY_TAB": "Activiteit", - "ACTIVITY_TAB_TITLE": "Show all the activity of this user", + "ACTIVITY_TAB_TITLE": "Alle activiteit van deze gebruiker weergeven", "PROJECTS_TAB": "Projecten", - "PROJECTS_TAB_TITLE": "List all projects that this user is a member", - "LIKES_TAB": "Likes", - "LIKES_TAB_TITLE": "List all likes made by this user", + "PROJECTS_TAB_TITLE": "Lijst alle projecten op waar deze gebruiker lid van is", + "LIKES_TAB": "Personen die dit leuk vinden", + "LIKES_TAB_TITLE": "Lijst alles op wat deze gebruiker leuk vind", "VOTES_TAB": "Stemmen", "VOTES_TAB_TITLE": "List all votes made by this user", "WATCHED_TAB": "Watched", @@ -681,21 +682,21 @@ "PROFILE_SIDEBAR": { "TITLE": "Jouw profiel", "DESCRIPTION": "Mensen kunnen alles zien wat je doet en waar je aan werkt. Voeg een mooie biografie toe voor een meer uitgebreide versie van jouw informatie.", - "ADD_INFO": "Edit bio" + "ADD_INFO": "Bio aanpassen" }, "PROFILE_FAVS": { - "FILTER_INPUT_PLACEHOLDER": "Type something...", + "FILTER_INPUT_PLACEHOLDER": "Typ iets...", "FILTER_TYPE_ALL": "Alles", - "FILTER_TYPE_ALL_TITLE": "Show all", + "FILTER_TYPE_ALL_TITLE": "Alles weergeven", "FILTER_TYPE_PROJECTS": "Projecten", - "FILTER_TYPE_PROJECT_TITLES": "Show only projects", - "FILTER_TYPE_USER_STORIES": "Stories", - "FILTER_TYPE_USER_STORIES_TITLES": "Show only user stories", + "FILTER_TYPE_PROJECT_TITLES": "Enkel projecten weergeven", + "FILTER_TYPE_USER_STORIES": "Verhalen", + "FILTER_TYPE_USER_STORIES_TITLES": "Enkel verhalen van gebruikers weergeven", "FILTER_TYPE_TASKS": "Taken", - "FILTER_TYPE_TASK_TITLES": "Show only tasks", + "FILTER_TYPE_TASK_TITLES": "Enkel taken weergeven", "FILTER_TYPE_ISSUES": "Issues", - "FILTER_TYPE_ISSUES_TITLE": "Show only issues", - "EMPTY_TITLE": "It looks like there's nothing to show here." + "FILTER_TYPE_ISSUES_TITLE": "Enkel problemen weergeven", + "EMPTY_TITLE": "Het ziet er naar uit dat er hier niets is om weer te geven." } }, "PROJECT": { @@ -766,20 +767,20 @@ "SYNC_SUCCESS": "Je project werd met succes geïmporteerd" }, "LIKE_BUTTON": { - "LIKE": "Like", - "LIKED": "Liked", - "UNLIKE": "Unlike", - "BUTTON_TITLE": "Like or unlike this project", + "LIKE": "Vind ik leuk", + "LIKED": "Leuk gevonden", + "UNLIKE": "Vind ik niet meer leu", + "BUTTON_TITLE": "Vind dit project leuk of niet", "COUNTER_TITLE": "{total, plural, one{one fan} other{# fans}}" }, "WATCH_BUTTON": { "BUTTON_TITLE": "Watch this project and set notification policy", - "WATCH": "Watch", + "WATCH": "Bekijk", "WATCHING": "Volgers", "COUNTER_TITLE": "{total, plural, one{one watcher} other{# watchers}}", "OPTIONS": { - "NOTIFY_ALL": "Receive all notifications", - "NOTIFY_ALL_TITLE": "Receive all notifications for this project", + "NOTIFY_ALL": "Ontvang alle notificaties", + "NOTIFY_ALL_TITLE": "Ontvang alle notificaties voor dit project", "NOTIFY_INVOLVED": "Only involved", "NOTIFY_INVOLVED_TITLE": "Recive notificacions only when you are involved", "UNWATCH": "Unwatch", @@ -857,7 +858,7 @@ "SECTION_NAME": "User story details", "LINK_TASKBOARD": "Taakbord", "TITLE_LINK_TASKBOARD": "Ga naar het dashboard", - "TOTAL_POINTS": "total points", + "TOTAL_POINTS": "totaal aantal punten", "ADD": "+ Nieuwe User Story toevoegen", "ADD_BULK": "Voeg enkele nieuwe User Stories in bulk toe", "PROMOTED": "Deze US werd gepromoveerd van Issue:", @@ -944,7 +945,7 @@ "PAGE_TITLE": "Backlog - {{projectName}}", "PAGE_DESCRIPTION": "Het backlog overzicht, met user stories en sprints van het project {{projectName}}: {{projectDescription}}", "SECTION_NAME": "Backlog", - "CUSTOMIZE_GRAPH": "Customize your backlog graph", + "CUSTOMIZE_GRAPH": "Je backlog grafiek aanpassen", "CUSTOMIZE_GRAPH_TEXT": "To have a nice graph that helps you follow the evolution of the project you have to set up the points and sprints through the", "CUSTOMIZE_GRAPH_ADMIN": "Admin", "CUSTOMIZE_GRAPH_TITLE": "Set up the points and sprints through the Admin", @@ -1024,7 +1025,7 @@ "NOT_FOUND": "Niet gevonden", "NOT_FOUND_TEXT": "Error 404. De pagina die je zoekt bestaat niet meer. Misschien kan je terugkeren naar de TAIGA startpagina en kijken of je kan vinden wat je zoekt.", "PERMISSION_DENIED": "Niet toegestaan", - "PERMISSION_DENIED_TEXT": "You don't have permission to access to this page.", + "PERMISSION_DENIED_TEXT": "Je hebt geen toegangsrechten tot deze pagina", "VERSION_ERROR": "Iemand bij Taiga heeft dit vooraf veranderd en onze Oempa-Loempa's konden je veranderingen niet toepassen. Gelieve te herladen en je veranderingen opnieuw toe te passen (ze zullen verloren gaan)" }, "TASKBOARD": { @@ -1035,7 +1036,7 @@ "TITLE_ACTION_ADD_BULK": "Wat nieuwe taken in bulk toevoegen", "TITLE_ACTION_ASSIGN": "Toegewezen taak", "TITLE_ACTION_EDIT": "Bewerk taak", - "PLACEHOLDER_CARD_TITLE": "This could be a task", + "PLACEHOLDER_CARD_TITLE": "Dit zou een taak kunnen zijn", "PLACEHOLDER_CARD_TEXT": "Split Stories into tasks to track them separately", "TABLE": { "COLUMN": "User story", @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Your project", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "Werkt aan", diff --git a/dist/locales/locale-pl.json b/dist/locales/locale-pl.json index d5789e8..060714d 100644 --- a/dist/locales/locale-pl.json +++ b/dist/locales/locale-pl.json @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Anuluj tworzenie", "SET_FIELD_NAME": "podaj nazwę pola", "SET_FIELD_DESCRIPTION": "podaj opis pola", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Aktualizuj pole", "ACTION_CANCEL_EDITION": "Anuluj edycję" }, @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Twój projekt", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "Pracujesz nad", diff --git a/dist/locales/locale-pt-br.json b/dist/locales/locale-pt-br.json index cbc6eda..bc8bad5 100644 --- a/dist/locales/locale-pt-br.json +++ b/dist/locales/locale-pt-br.json @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Cancelar criação", "SET_FIELD_NAME": "Definir nome do seu campo personalizados", "SET_FIELD_DESCRIPTION": "Definir a descrição do seu campo personalizado", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Atualizar campo personalizado", "ACTION_CANCEL_EDITION": "Cancelar edição" }, @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Seu projeto", - "TEXT": "Bem-Vindo! Aqui você encontrará os projetos que você está envolvido. Temos para você, modelos de projetos para ajudar você a descobrir a potência do Taiga. " + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "Trabalhando em", diff --git a/dist/locales/locale-ru.json b/dist/locales/locale-ru.json index 9ac3bc0..e2d693a 100644 --- a/dist/locales/locale-ru.json +++ b/dist/locales/locale-ru.json @@ -579,6 +579,7 @@ "CANCEL_TITLE": "Отменить создание", "SET_FIELD_NAME": "Введите имя поля", "SET_FIELD_DESCRIPTION": "Назначьте описание специальному полю", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "Обновить поле", "ACTION_CANCEL_EDITION": "Отменить правку" }, @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "Ваш проект", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "Работает над", diff --git a/dist/locales/locale-zh-hant.json b/dist/locales/locale-zh-hant.json index 1f22a88..0b0178e 100644 --- a/dist/locales/locale-zh-hant.json +++ b/dist/locales/locale-zh-hant.json @@ -579,6 +579,7 @@ "CANCEL_TITLE": "取消創建", "SET_FIELD_NAME": "設定你的客制欄位名稱 ", "SET_FIELD_DESCRIPTION": "設定你客製化欄位的文字描述", + "FIELD_TYPE_DEFAULT": "-- select one --", "ACTION_UPDATE": "更新客製化欄位", "ACTION_CANCEL_EDITION": "取消編輯 " }, @@ -1356,7 +1357,7 @@ "DASHBOARD": { "STEP1": { "TITLE": "你的專案", - "TEXT": "Welcome! Here you will find the projects you are involved on. We have left you sample project templates to help you discover the power of Taiga." + "TEXT": "Welcome! Here you will find the projects you are involved on." }, "STEP2": { "TITLE": "進行中", diff --git a/dist/styles/theme-high-contrast.css b/dist/styles/theme-high-contrast.css index 802ea14..b6c68b9 100644 --- a/dist/styles/theme-high-contrast.css +++ b/dist/styles/theme-high-contrast.css @@ -1,4 +1,4 @@ -@charset "UTF-8";.introjs-arrow,blockquote:after,blockquote:before,q:after,q:before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.invitation-main .avatar,.kanban,.login-main{-webkit-box-direction:normal}.kanban-task-minimized .task-name,.ticket-estimation .ticket-role-points .role,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.home-project-list p,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;line-height:18px;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! +@charset "UTF-8";.introjs-arrow,blockquote:after,blockquote:before,q:after,q:before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.kanban-task-minimized .task-name,.ticket-estimation .ticket-role-points .role,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.home-project-list p,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;line-height:18px;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! * Pikaday * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}body,h1,h2,h3,h4,h5,h6{font-weight:400;color:#212121}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-weight:400;font-family:opensans-regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:4;-webkit-flex:4;-ms-flex:4;flex:4;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}fieldset,p img{margin:0}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h2{font-size:2rem}h1,h1 span{font-size:3rem}h1,h2{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{margin-bottom:1rem;text-transform:uppercase}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#000}h1 .date{max-width:500px}h2{line-height:1.2;margin-bottom:1rem}p{line-height:1.5}em{font-style:italic}strong{font-weight:700}[class*=' icon-']:before,[class^=icon-]:before,[data-icon]:before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]:before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug:before{content:'a'}.icon-copy:before{content:'b'}.icon-minimize:before{content:'c'}.icon-maximize:before{content:'d'}.icon-comment:before{content:'e'}.icon-plus:before{content:'f'}.icon-attachments:before{content:'g'}.icon-edit:before{content:'h'}.icon-documents:before{content:'i'}.icon-delete:before{content:'j'}.icon-arrow-bottom:before{content:'k'}.icon-arrow-left:before{content:'l'}.icon-arrow-right:before{content:'m'}.icon-arrow-up:before{content:'n'}.icon-briefcase:before{content:'o'}.icon-caret-down:before{content:'p'}.icon-caret-up:before{content:'q'}.icon-check-square:before{content:'r'}.icon-notification-error:before{content:'s'}.icon-settings:before{content:'t'}.icon-document:before{content:'u'}.icon-warning:before{content:'v'}.icon-move:before{content:'w'}.icon-drag-v:before{content:'x'}.icon-filter:before{content:'y'}.icon-help:before{content:'z'}.icon-reload:before{content:'A'}.icon-writer:before{content:'B'}.icon-stats:before{content:'C'}.icon-floppy:before{content:'D'}.icon-warning-alt:before{content:'E'}.icon-video:before{content:'F'}.icon-bulk:before{content:'G'}.icon-vunfold:before{content:'H'}.icon-tasks:before{content:'I'}.icon-kanban:before{content:'J'}.icon-search:before{content:'K'}.icon-wiki:before{content:'L'}.icon-team:before{content:'M'}.icon-vfold:before{content:'N'}.icon-issues:before{content:'O'}.icon-iocaine:before{content:'P'}.icon-archive:before{content:'Q'}.icon-capslock:before{content:'R'}.icon-upload:before{content:'S'}.icon-github:before{content:'T'}.icon-timeline:before{content:'U'}.icon-scrum:before{content:'V'}.icon-project:before{content:'W'}.icon-heart:before{content:'X'}.icon-eye:before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite:before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.blocked-warning .icon,.icon,.us-story-main-data .us-title.blocked{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}.pika-single{z-index:999999}.pika-single .pika-title{color:#212121}.pika-single .is-selected .pika-button{background:#000;border-radius:0!important;box-shadow:inset 0 1px 3px #000}.pika-single .is-today .pika-button{color:#000}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#212121!important;border-radius:0!important;box-shadow:inset 0 1px 3px #212121!important}fieldset{border:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#757575;display:none;position:absolute;right:1rem}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-attributes .admin-attributes-section .checksley-error-list li{font-weight:100}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#f5f5f5}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.kanban,.taskboard{height:calc(100vh - 40px)}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.backlog-menu{background:#f5f5f5;color:#212121;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#212121;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#757575;color:#f5f5f5}.backlog-menu .trans-button.active:hover{background:#c2c2c2}.invitation-main,.login-main{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat}.backlog-menu .trans-button.move-to-current-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-weight:100;font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.blocked-warning .blocked,.login-main .logo,.login-main .tagline,.us-story-main-data .us-title .us-number{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#f5f5f5;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#000}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#000}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main,.login-main{bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;-webkit-box-orient:horizontal;position:fixed;right:0;top:0;z-index:999;left:0}.login-main{background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.login-main .tagline{font-size:2rem}.login-main fieldset{margin-bottom:.5rem}.login-main .logo,.login-main form{margin-bottom:1rem}.login-main .login-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.login-main .logo-svg{padding:0 33%;text-align:center;width:100%}.login-main .logo{font-size:3rem;color:#fff;text-align:center}.login-main .tagline{color:#fff;line-height:2rem;margin-bottom:1rem;text-align:center;text-transform:uppercase}.login-main .login-text,.login-main .register-text{text-align:center}.login-main .login-text a:hover,.login-main .register-text a:hover{color:#212121}.login-main .button{color:#fff;display:block;text-align:center}.login-main a:hover{color:#fff}.error-main{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.taskboard-inner,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table,.taskboard-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#000}.error-main a:hover{color:#212121}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#000}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a,.us-story-main-data .us-title .us-name,.us-story-main-data .us-title .us-number{font-size:2rem}.us-story-main-data .us-title{font-weight:400;font-family:opensans-regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:2rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{background:#f5f5f5;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:#ff2400;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff0062}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff0062;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.basic-table,.us-story-main-data .us-title .us-title-text{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:9;-webkit-flex-grow:9;-ms-flex-positive:9;flex-grow:9}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:0;max-width:94%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#f5f5f5;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#212121;display:inline-block;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#f5f5f5;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#f5f5f5;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #f5f5f5;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#000}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:#ff2400;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .block-description{color:#212121;margin:0}.duty-content .edit-description,.wiki-content,.wysiwyg{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.duty-content{position:relative}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#212121}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#f5f5f5}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#212121}.duty-content .view-description .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wysiwyg textarea{background:#fff;max-height:none}.wiki .remove{font-size:.9rem;color:#f5f5f5}.wiki .remove:hover span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:#ff2400;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#f5f5f5;margin-right:.2rem}.wiki-content{position:relative}.wiki-content.editable:hover .wysiwyg{background:#f5f5f5;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#212121;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row,.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #ebebeb;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#000}.trans-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#000}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#212121;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#212121;color:#fff}.button-blackish{background:#212121;color:#f5f5f5}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff0062}.button-red:hover{background:#ff2400;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:#ff2400}.button-block:hover{background:#ff0062;color:#fff}.button-bulk{background:#000;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-auth,.button-bulk:hover{background:#212121}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#f0f0f0;border:1px dashed #e1e1e1;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#e1e1e1;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#e1e1e1;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#dcdcdc;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#757575;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-weight:400;font-size:.9rem;font-family:opensans-regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#212121;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.single-filter,.ticket-created-by .created-by .created-title.editable{cursor:pointer}.check input:disabled+div{background-color:#f5f5f5}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;margin-top:.5rem;position:relative}.ticket-created-by .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;line-height:1.5}.ticket-created-by .created-by .created-title{color:#000}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a,.ticket-estimation .ticket-role-points .role{font-size:.9rem}.ticket-estimation .ticket-role-points .points{font-weight:400;font-size:1.6rem}.ticket-estimation .points-per-role{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ticket-estimation .ticket-role-points{background:rgba(245,245,245,.1);border-radius:2px;color:rgba(33,33,33,.3);-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:.1rem;padding:.5rem 0 .1rem;position:relative;text-align:center;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.active{background:rgba(33,33,33,.9);color:#f5f5f5}.ticket-estimation .ticket-role-points:first-child{background:rgba(33,33,33,.25);border-radius:0;color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child{border:0}.ticket-estimation .ticket-role-points .points{font-family:opensans-regular,Arial,Helvetica,sans-serif;display:block;text-align:center}.ticket-estimation .ticket-role-points .role{max-width:90%;overflow:hidden;display:inline-block;text-align:center}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:35%;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#212121;color:#fff}.ticket-estimation .popover.fix{background:#212121;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#212121;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#dcdcdc;display:block;width:100%}.single-filter .number{background:#c2c2c2;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#212121;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:#ff2400;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .task-name{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task{background:#F0EFD1;border:1px solid #000;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#000;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#212121}.kanban-task.blocked{background:#ff2400;border:1px solid #cc1d00;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.kanban-task .kanban-tagline{border-color:#000;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #000;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #000;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#000;display:block}.kanban-task .task-num{color:#212121;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#000;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#000;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e8e8e8;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#e1e1e1;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#f5f5f5}.kanban-task-maximized .task-archived p{color:#f5f5f5;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#757575;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#000;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e8e8e8;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#f5f5f5}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-itemtype-project .icon svg,.list-itemtype-ticket .icon svg,.list-itemtype-timeline .icon svg,.list-itemtype-user .icon svg,.loading-spinner{max-height:1rem;max-width:1rem}.kanban-task-minimized .task-archived p{color:#f5f5f5;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#f5f5f5;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-weight:400;font-family:opensans-regular,Arial,Helvetica,sans-serif}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#000}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #f5f5f5;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#000}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#f5f5f5}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#f5f5f5;margin-right:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#f5f5f5;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#000}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#000}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-data .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#757575;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#757575;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#ffc107}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#009688}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e91e63}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#9c27b0}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#cddc39}.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}a.help-button,a.help-markdown{font-size:.9rem;color:#f5f5f5}a.help-button:hover .icon,a.help-button:hover span,a.help-markdown:hover .icon,a.help-markdown:hover span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button .icon,a.help-markdown .icon{color:#f5f5f5;margin-right:.2rem}.markItUpHeader ul{background:#f5f5f5;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#f5f5f5;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(33,33,33,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-light,.notification-message-error{-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%)}.notification-message-error{background:rgba(255,36,0,.9);top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(245,245,245,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(255,36,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#f5f5f5;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span,.paginator a:hover{background:#212121}.paginator a:hover{color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .dots{background:0 0;color:#f5f5f5}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#757575;color:#f5f5f5;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#212121;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#212121;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{height:.5rem;width:.5rem}.private path{fill:#f5f5f5;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color,.select-color a{font-size:.9rem}.select-color input{font-weight:400;font-size:1rem}.select-color a{border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#f5f5f5;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background-color:#f5f5f5;width:243px}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#f5f5f5;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.empty-burndown,.empty-burndown .title,.summary .description{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#212121}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#212121;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats.active .graph{fill:#000}.summary .stats svg{height:100%;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#c2c2c2;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#212121}.empty-burndown path,.track-button.active .track-icon path{fill:#000}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#212121;height:24px}.summary-progress-bar .defined-points{background:#ff0062;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#212121;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#000;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#212121}.large-summary .icon.icon-stats.active:hover{color:#000;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(0,0,0,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#000;margin:0}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-radius:0 5px 5px 0;color:#212121;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag .icon-delete{color:#f5f5f5;margin-left:1rem}.tag .icon-delete:hover{color:#ff2400}.ui-autocomplete{background:#fff;border:1px solid #f5f5f5;z-index:99910}.ui-autocomplete .ui-state-focus{background:#212121}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{padding:.4rem;width:14rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#f5f5f5}.tags-block .add-tag:hover{color:#212121}.taskboard-task .task-name{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task{background:#F0EFD1;border:1px solid #000;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#000;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#212121}.taskboard-task.blocked{background:#ff2400;border:1px solid #cc1d00;color:#fff}.taskboard-task.blocked a,.taskboard-task.blocked span,.taskboard-task.blocked:hover .icon-drag-h,.taskboard-task.blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.taskboard-task .taskboard-tagline{border-color:#000;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #000;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #000;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#000;display:block}.taskboard-task .task-assigned:hover{color:#000}.taskboard-task .task-num{color:#212121;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#000;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#000}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.watch-options a{font-weight:100}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#f5f5f5;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e8e8e8;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#212121}.track-button.active .track-inner{background:rgba(33,33,33,.2)}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#212121}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:#ff2400;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff0062}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.admin-project-export-result .spin img,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(245,245,245,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#212121}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#212121}.upvote-btn a.active path,.upvote-btn a:hover path{fill:#000}.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#f5f5f5;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#000;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a.active{background:rgba(33,33,33,.2);color:#000;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover{background:#ff2400;color:#f5f5f5}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff0062}.sprints .add-sprint path,.upvote-btn path{fill:#f5f5f5}.upvote-btn svg{height:1rem;width:1rem}.upvote-btn span{display:block}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{color:#212121;margin-left:.5rem}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem .5rem .3rem;vertical-align:middle}.assigned-to-list .user-list-single:last-child,.ticket-watchers .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar,.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.assigned-to-list .user-list-single:hover{background:#949494;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#8c8c8c;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.3rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-name{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:#ff2400;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem;margin-bottom:.5rem}.wysiwyg h1{font-weight:400;font-size:2rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;font-weight:700;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#000}.wysiwyg a:hover{color:#212121}.wysiwyg p{line-height:1.4rem;margin-bottom:1rem}.wysiwyg code,.wysiwyg pre{background:#3b3b3b;color:#f5f5f5;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #f5f5f5;margin-bottom:1rem}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#f5f5f5 1px solid}.wysiwyg th{border-right:#f5f5f5 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#f5f5f5 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{margin-bottom:2rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .delete,.admin-menu li{font-size:1.2rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .privacy-settings label,.project-details input,.project-details label,.project-details textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.project-details form{max-width:700px;width:100%}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details textarea{height:10rem}.project-details .privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.project-details .privacy-settings>div{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;position:relative}.project-details .privacy-settings>div:first-child{margin-right:.5rem}.project-details .privacy-settings label{border:1px solid #b8b8b8;cursor:not-allowed;display:block;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-details .privacy-settings label span{color:#b8b8b8}.project-details .privacy-project{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.project-details .privacy-project:checked+label{background:#9dce0a;border:1px solid #9dce0a}.project-details .privacy-project:checked+label span{color:#fff}.project-details .button-green{color:#fff;display:block;text-align:center}.project-details .delete-project{font-size:.9rem;display:block;margin-top:1rem}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.backlog-table-body,.backlog-table-header,.kanban-table,.taskboard-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:opensans-regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprints-empty a,.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-header .task-colum-name,.taskboard-userstory-box .us-title{font-size:1.2rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.attachments-header,.ticket-assigned-to{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.taskboard-userstory-box .us-title{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:1rem;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.attachments,.duty-custom-fields{margin-bottom:2rem}.ticket-assigned-to .user-avatar{-webkit-flex-basis:4rem;-ms-flex-preferred-size:4rem;flex-basis:4rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block}.attachments-header .attachments-title,.colors-table .table-header,.single-attachment .attachment-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .user-assigned{font-size:1.2rem;color:#72a114;cursor:default;line-height:1.5rem}.ticket-assigned-to .assigned-to .user-assigned.editable{cursor:pointer}.ticket-assigned-to .assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assigned-to .assigned-name{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.add-attach span,.more-attachments,.single-attachment,.single-attachment .editable-attachment-comment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#444}.attachments-header .icon,.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings,.single-attachment .icon-delete{font-size:1.2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.attachments-header .attachments-num,.attachments-header .attachments-text{margin-right:.1rem}.attachments-header .icon{color:#444;cursor:pointer}.attachments-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem 1rem;position:relative}.category-config,.more-attachments{border-bottom:1px solid #b8b8b8}.single-attachment:hover .attachment-settings .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.single-attachment.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.deprecated,.single-attachment.deprecated .attachment-name a{color:#b8b8b8}.single-attachment.sortable-placeholder{background:#f5f5f5;height:40px}.single-attachment .attachment-name{max-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.5rem}.single-attachment .attachment-size{color:#b8b8b8;-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem}.single-attachment .attachment-comments,.single-attachment .editable-attachment-comment{-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-comments span,.single-attachment .editable-attachment-comment span{color:#555}.single-attachment .attachment-settings{-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings{color:#b8b8b8;display:block;position:absolute}.single-attachment .attachment-settings .editable-settings:hover,.single-attachment .attachment-settings .settings:hover{color:#72a114}.single-attachment .attachment-settings .settings{opacity:0;top:.5rem}.single-attachment .attachment-settings .editable-settings{opacity:1;top:1rem}.single-attachment .attachment-settings .icon-edit,.single-attachment .attachment-settings .icon-floppy{right:3.5rem}.single-attachment .attachment-settings .icon-delete{right:2rem}.single-attachment .attachment-settings .icon-delete:hover{color:red}.single-attachment .attachment-settings .icon-drag-v{cursor:move;right:0}.single-attachment .icon-delete{color:#b8b8b8}.single-attachment .icon-delete:hover{color:red}.single-attachment .editable-attachment-deprecated{padding-left:1rem}.single-attachment .editable-attachment-deprecated span{color:#b8b8b8}.single-attachment .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.single-attachment .editable-attachment-deprecated input:checked+span{color:#444}.single-attachment .percentage{background:rgba(114,161,20,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.more-attachments{display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#72a114;margin-left:.5rem}.more-attachments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.add-attach{cursor:pointer;overflow:hidden;position:relative}.add-attach input{display:none}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.add-attach span{color:#b8b8b8}.attachment-preview img{max-height:95vh;max-width:95vw}.category-config:first-child{border-top:1px solid #b8b8b8}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition .current-color{cursor:pointer}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields form label{cursor:pointer}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;margin-bottom:.5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{margin-bottom:1rem;max-height:9rem;min-height:7rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-block textarea,.lightbox-create-issue textarea{min-height:8rem;max-height:12rem;margin-bottom:1rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list{right:.5rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.main-nav .active svg path,.main-nav svg path{opacity:1}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row,.related-tasks-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:flex}.main-nav a,.main-nav span{display:block}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .ticket-role-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;max-width:calc(100% * (1/5) - .2rem)}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(5n+5){margin-right:0}.lb-create-edit-userstory .points-per-role{margin-bottom:1rem}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;min-height:calc(100vh - 40px);padding:1rem 0}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper:after{background:#050505;content:'';height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:12px;z-index:98}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{color:#9dce0a}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a,.related-tasks-header .icon{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.related-tasks-header .icon{color:#444;cursor:pointer}.related-tasks-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.filters-inner .loading .loading-spinner,.ticket-detail-settings .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg)}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data .ticket-data-container,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .status-data .pop-status,.ticket-status .status-data .pop-status a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-track-buttons .track-inner{font-size:.9rem}.ticket-data .ticket-title span:last-child,.ticket-track-buttons .track-button-counter{font-size:1.2rem}.ticket-data .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .status-data .pop-status,.ticket-status .type-data .pop-type,.ticket-track-buttons .track-inner{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-detail-settings .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.ticket-data .ticket-title{font-size:1.6rem;margin:1.5rem 0 2rem}.ticket-data .ticket-title span{margin-right:.25rem}.ticket-data .ticket-data-container{margin-bottom:1rem}.ticket-data .ticket-data-container .icon{margin-left:.25rem}.ticket-data .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-data .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-data .ticket-estimation .ticket-role-points{max-width:25%}.ticket-data .ticket-estimation .ticket-role-points:first-child{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.ticket-status{margin-bottom:.5rem}.ticket-status:last-child{margin:0}.ticket-status div{background:#e8e8e8;padding:.5rem 1rem .5rem .5rem;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{position:relative}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .severity-data{position:relative}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .priority-data .pop-priority:after,.ticket-status .status-data .pop-status:after{background:#050505;height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);content:''}.ticket-status .priority-data{position:relative}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{position:absolute;transform:rotate(45deg);width:0}.ticket-status .status-data{position:relative}.ticket-status .status-data .pop-status{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .status-data .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .status-data .pop-status a:last-child{border:0}.ticket-status .status-data .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .status-data .pop-status a:hover.point{color:#fff}.ticket-status .status-data .pop-status:after{position:absolute;transform:rotate(45deg);width:0}.ticket-track-buttons .track-inner{background:#e8e8e8;padding:.25rem;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-track-buttons .track-inner:hover{background:#dcdcdc}.ticket-track-buttons .track-button{width:100%}.ticket-track-buttons .active .track-button-counter{background:rgba(68,68,68,.5)}.ticket-track-buttons .active:hover .track-inner{background:rgba(157,206,10,.2)}.ticket-track-buttons .active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-track-buttons .active.is-hover path{fill:#ff8282}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.ticket-track-buttons .track-button-counter{background:rgba(68,68,68,.25);color:#f5f5f5;padding:0 .5rem}.ticket-track-buttons .vote-button{margin-bottom:.3rem}.ticket-track-buttons .watch-button{border-bottom:0}.ticket-track-buttons .ticket-watchers{margin:.5rem 0}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-track-buttons .add-watcher{display:block;margin:.5rem}.ticket-track-buttons .add-watcher .icon{background:rgba(68,68,68,.25);color:#f5f5f5;margin-right:.5rem;padding:.25rem}.ticket-track-buttons .add-watcher:hover .icon{background:#9dce0a;color:#f5f5f5;-webkit-transition:background .3s linear;transition:background .3s linear}.ticket-detail-settings{margin-top:2rem}.ticket-detail-settings .button,.ticket-detail-settings label{display:block;margin-bottom:.5rem;text-align:center}.ticket-detail-settings .button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .button-gray,.ticket-detail-settings .button-gray:hover{background:#b8b8b8}.ticket-detail-settings .button-gray.editable:hover{background:#444;cursor:pointer}.ticket-detail-settings .button-gray.active{background:#72a114}.ticket-detail-settings .item-block.editable:hover{background:red;cursor:pointer}.ticket-detail-settings .button-red{display:block;margin-top:2rem}.wizard-create-project{background:url(/images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#f5f5f5}.create-project input::-moz-placeholder{color:#f5f5f5}.create-project input:-moz-placeholder{color:#f5f5f5}.create-project input:-ms-input-placeholder{color:#f5f5f5}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#212121}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-width:1rem}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .description{font-weight:100}.single-project .title{font-weight:800}.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{margin-bottom:2rem}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.single-project h1{color:#000;display:inline-block;line-height:1.2;margin-bottom:0;margin-right:3rem}.single-project .private{font-size:1rem;vertical-align:super}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#000}.single-project .track-container .icon svg{max-height:1rem;max-width:1rem}.single-project .project-data{display:flex}.single-project .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{margin-right:.14rem;width:24%}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1200px){.issues-table .created-field,.issues-table .level-field{display:none}}@media (max-width:767px){.issues-table .assigned-field,.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-body,.kanban-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-header .task-colum-name{font-size:1.2rem;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-inner,.search-filter ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:opensans-semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter a{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;opacity:.2}.search-filter ul{border-bottom:3px solid #b8b8b8;display:flex;padding-bottom:.5rem}.search-filter li{margin-right:1rem}.search-filter .active,.search-filter a:hover{color:#555;opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.search-filter .icon{margin-right:.4rem}.search-filter .name{padding-left:5px}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.search-result-table .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.user-change-password label,.user-profile label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile form .avatar-container p{font-size:.75rem}.user-profile .delete-account,.user-profile form .avatar-container .use-gravatar{font-size:.9rem}.user-profile form .avatar-container span{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.user-profile form .avatar-container .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem}.user-profile form{max-width:700px;width:100%}.user-profile form .container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile form .avatar-container{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:1rem}.user-profile form .avatar-container .image-container{position:relative}.user-profile form .avatar-container .avatar{border-radius:8%;width:100%}.user-profile form .avatar-container .overlay{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile form .avatar-container .loading-spinner{border:0;min-height:3rem;min-width:3rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.user-profile form .avatar-container p{line-height:.8rem;margin-bottom:.3rem;text-align:center}.user-profile form .avatar-container .use-gravatar{cursor:pointer;display:inline-block;text-align:center;width:100%}.user-profile form .data{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.user-profile fieldset{margin-bottom:1rem}.user-profile .submit{margin-top:2rem}.user-profile label{display:block;margin-bottom:.5rem}.user-profile textarea{min-height:7rem}.user-profile .button-green{color:#fff;cursor:pointer;display:block;padding:12px;text-align:center}.user-profile .delete-account{display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.wiki-nav li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center;width:100%}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#F0EFD1;border:1px solid #000;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single.blocked,.working-on .duty-single.blocked{background:rgba(255,130,130,.2);color:red}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project-list li a{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.empty-ticket,.home-project-list li a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project-list p{font-size:.75rem}.projects-empty p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.home-project-list h2,.home-project-list p{font-family:opensans-regular,Arial,Helvetica,sans-serif}.home-project-list li{border-radius:3px;cursor:pointer;margin-bottom:.75rem;padding:1rem;text-overflow:ellipsis}.home-project-list li:hover{border-color:#9dce0a;-webkit-transition:all .3s linear;transition:all .3s linear}.home-project-list li:hover p{color:#555;-webkit-transition:color .3s linear;transition:color .3s linear}.home-project-list li:hover .private path{fill:#555;-webkit-transition:fill .3s linear;transition:fill .3s linear}.home-project-list li a{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:5rem}.home-project-list h2{color:#555;font-size:1.5rem;line-height:1.3;margin-bottom:.5rem;text-transform:none}.home-project-list h2 .project-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.home-project-list p{line-height:125%;margin:0}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.navbar .nav-left>a path,.navbar a:hover svg path{fill:#fff}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar:after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-width:2rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#212121}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-width:1.2rem}.navbar svg path{fill:#fff;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(33,33,33,0);border-bottom-color:#212121}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#f5f5f5;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#212121}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.main-nav svg path,.navbar a svg path{fill:#fff}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(/images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{display:inline-block;padding:1rem 1.25rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar p{font-size:.9rem}.profile-sidebar h4{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a:hover,h1 .date,h2 .date,h3 .date,h4 .date,h5 .date,h6 .date{color:#000}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}.checksley-error-list{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}body{background:#fff}.extrabar,.master,.menu-secondary,.menu-tertiary{background:#fff;border-left:1px solid #000;border-right:1px solid #000}.master,.menu-secondary{background:#fff}.menu-tertiary{background-color:#fff}.extrabar{background:#fff}h1,h2,h3,h4,h5,h6{font-family:Arial,Helvetica,sans-serif}a{color:#212121}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#fff;border-color:#000;color:#000}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#000}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#000}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#000}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#000}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #ff2400}.checksley-error-list{background:rgba(255,36,0,.7);color:#fff}blockquote{border-left:5px solid #757575}blockquote,blockquote p,cite{color:#000}.navbar a :hover,.summary{color:#fff}.button-gray{background:#000}.tag{background:#fff;border:1px solid #000}.summary{background:#212121}.navbar{background:#000}.navbar:after{background:url(../images/menu-vert.png) top left}.activity-item p,.duty-custom-fields .custom-field-data .custom-field-description,.kanban-table-header .task-colum-name .icon,.points-per-role>li,.private path,.table-team .avatar .position,.taskboard-table-header .task-colum-name .icon,.us-created-by .created-by .created-date,.us-created-by .created-by .created-title,.watching .duty-id,.working-on .duty-id{color:#000}tg-project-menu{background-color:#000;background-image:none}.main-nav .active{background:#fff}.main-nav .active svg path{fill:#000}.taskboard-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.taskboard-table-body .taskboard-tasks-box{background:#fff;border:1px solid #000}.kanban-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.kanban-table-body .kanban-uses-box{background:#f5f5f5}.points-per-role>li:first-child{background:#000}.us-detail-settings .button-gray{background:0 0;border:1px solid #000;color:#000}.us-detail-settings .button-gray.active,.us-detail-settings .button-gray:hover{color:#fff}.history-tabs a,.more-attachments span,.us-detail-settings .button-gray span{color:#000}.login-main,.login-main a{color:#fff}.home-project-list li{border:1px solid #000}.home-project-list p{color:#000}.profile-content-tabs .tab,.profile-sidebar p{color:#212121}.settings-nav .active{background:#000;color:#fff}.admin-submenu ul a{color:#000}.policy-table input:checked+label{color:#fff}.policy-table label{color:#000}.policy-table label:hover{color:#fff}.admin-common .admin-subtitle,.admin-membership-table .avatar .email,.admin-membership-table .delete{color:#000}.admin-functionalities .functionality.active{background:#fff;border:1px solid #000} \ No newline at end of file + */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}body,h1,h2,h3,h4,h5,h6{font-weight:400;color:#212121}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-weight:400;font-family:opensans-regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:4;-webkit-flex:4;-ms-flex:4;flex:4;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}fieldset,p img{margin:0}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h2{font-size:2rem}h1,h1 span{font-size:3rem}h1,h2{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{margin-bottom:1rem;text-transform:uppercase}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#000}h1 .date{max-width:500px}h2{line-height:1.2;margin-bottom:1rem}p{line-height:1.5}em{font-style:italic}strong{font-weight:700}[class*=' icon-']:before,[class^=icon-]:before,[data-icon]:before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]:before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug:before{content:'a'}.icon-copy:before{content:'b'}.icon-minimize:before{content:'c'}.icon-maximize:before{content:'d'}.icon-comment:before{content:'e'}.icon-plus:before{content:'f'}.icon-attachments:before{content:'g'}.icon-edit:before{content:'h'}.icon-documents:before{content:'i'}.icon-delete:before{content:'j'}.icon-arrow-bottom:before{content:'k'}.icon-arrow-left:before{content:'l'}.icon-arrow-right:before{content:'m'}.icon-arrow-up:before{content:'n'}.icon-briefcase:before{content:'o'}.icon-caret-down:before{content:'p'}.icon-caret-up:before{content:'q'}.icon-check-square:before{content:'r'}.icon-notification-error:before{content:'s'}.icon-settings:before{content:'t'}.icon-document:before{content:'u'}.icon-warning:before{content:'v'}.icon-move:before{content:'w'}.icon-drag-v:before{content:'x'}.icon-filter:before{content:'y'}.icon-help:before{content:'z'}.icon-reload:before{content:'A'}.icon-writer:before{content:'B'}.icon-stats:before{content:'C'}.icon-floppy:before{content:'D'}.icon-warning-alt:before{content:'E'}.icon-video:before{content:'F'}.icon-bulk:before{content:'G'}.icon-vunfold:before{content:'H'}.icon-tasks:before{content:'I'}.icon-kanban:before{content:'J'}.icon-search:before{content:'K'}.icon-wiki:before{content:'L'}.icon-team:before{content:'M'}.icon-vfold:before{content:'N'}.icon-issues:before{content:'O'}.icon-iocaine:before{content:'P'}.icon-archive:before{content:'Q'}.icon-capslock:before{content:'R'}.icon-upload:before{content:'S'}.icon-github:before{content:'T'}.icon-timeline:before{content:'U'}.icon-scrum:before{content:'V'}.icon-project:before{content:'W'}.icon-heart:before{content:'X'}.icon-eye:before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite:before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.blocked-warning .icon,.icon,.us-story-main-data .us-title.blocked{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}.pika-single{z-index:999999}.pika-single .pika-title{color:#212121}.pika-single .is-selected .pika-button{background:#000;border-radius:0!important;box-shadow:inset 0 1px 3px #000}.pika-single .is-today .pika-button{color:#000}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#212121!important;border-radius:0!important;box-shadow:inset 0 1px 3px #212121!important}fieldset{border:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#757575;display:none;position:absolute;right:1rem}.auth,.error-main{bottom:0;z-index:999;left:0}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-attributes .admin-attributes-section .checksley-error-list li{font-weight:100}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#f5f5f5}.auth .logo,.auth .tagline{color:#fff;text-align:center}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.kanban,.taskboard{height:calc(100vh - 40px)}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth .logo{font-size:3rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.auth .auth-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{padding:0 33%;text-align:center;width:100%}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{text-align:center}.auth .login-text a:hover,.auth .register-text a:hover{color:#212121}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moustache;animation-name:moustache;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;fill:rgba(0,0,0,.9);stroke:#212121;stroke-width:1px;-webkit-transform-origin:50% 20%;-ms-transform-origin:50% 20%;transform-origin:50% 20%;-webkit-transition:.3s;transition:.3s}.moustache:hover{fill:rgba(33,33,33,.9);-webkit-transition:.3s;transition:.3s}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}@-webkit-keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}.backlog-menu{background:#f5f5f5;color:#212121;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#212121;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#757575;color:#f5f5f5}.backlog-menu .trans-button.active:hover{background:#c2c2c2}.backlog-menu .trans-button.move-to-current-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-weight:100;font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#f5f5f5;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#000}.invitation-main .button-auth{display:block}.error-main,.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.invitation-main .button-blackish:hover{background:#000}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.taskboard-inner,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table,.taskboard-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#000}.error-main a:hover{color:#212121}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#000}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a,.us-story-main-data .us-title .us-name,.us-story-main-data .us-title .us-number{font-size:2rem}.blocked-warning .blocked,.us-story-main-data .us-title .us-number{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.us-story-main-data .us-title{font-weight:400;font-family:opensans-regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:2rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{background:#f5f5f5;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:#ff2400;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff0062}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff0062;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.basic-table,.us-story-main-data .us-title .us-title-text{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:9;-webkit-flex-grow:9;-ms-flex-positive:9;flex-grow:9}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:0;max-width:94%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#f5f5f5;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#212121;display:inline-block;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#f5f5f5;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#f5f5f5;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #f5f5f5;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#000}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:#ff2400;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .block-description{color:#212121;margin:0}.duty-content .edit-description,.wiki-content,.wysiwyg{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.duty-content{position:relative}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#212121}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#f5f5f5}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#212121}.duty-content .view-description .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wysiwyg textarea{background:#fff;max-height:none}.wiki .remove{font-size:.9rem;color:#f5f5f5}.wiki .remove:hover span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:#ff2400;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#f5f5f5;margin-right:.2rem}.wiki-content{position:relative}.wiki-content.editable:hover .wysiwyg{background:#f5f5f5;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#212121;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row,.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #ebebeb;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#000}.trans-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#000}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#212121;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#212121;color:#fff}.button-blackish{background:#212121;color:#f5f5f5}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff0062}.button-red:hover{background:#ff2400;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:#ff2400}.button-block:hover{background:#ff0062;color:#fff}.button-bulk{background:#000;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-auth,.button-bulk:hover{background:#212121}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#f0f0f0;border:1px dashed #e1e1e1;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#e1e1e1;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#e1e1e1;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#dcdcdc;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#757575;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-weight:400;font-size:.9rem;font-family:opensans-regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#212121;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.single-filter,.ticket-created-by .created-by .created-title.editable{cursor:pointer}.check input:disabled+div{background-color:#f5f5f5}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;margin-top:.5rem;position:relative}.ticket-created-by .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;line-height:1.5}.ticket-created-by .created-by .created-title{color:#000}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a,.ticket-estimation .ticket-role-points .role{font-size:.9rem}.ticket-estimation .ticket-role-points .points{font-weight:400;font-size:1.6rem}.ticket-estimation .points-per-role{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ticket-estimation .ticket-role-points{background:rgba(245,245,245,.1);border-radius:2px;color:rgba(33,33,33,.3);-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:.1rem;padding:.5rem 0 .1rem;position:relative;text-align:center;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.active{background:rgba(33,33,33,.9);color:#f5f5f5}.ticket-estimation .ticket-role-points:first-child{background:rgba(33,33,33,.25);border-radius:0;color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child{border:0}.ticket-estimation .ticket-role-points .points{font-family:opensans-regular,Arial,Helvetica,sans-serif;display:block;text-align:center}.ticket-estimation .ticket-role-points .role{max-width:90%;overflow:hidden;display:inline-block;text-align:center}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:35%;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#212121;color:#fff}.ticket-estimation .popover.fix{background:#212121;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#212121;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#dcdcdc;display:block;width:100%}.single-filter .number{background:#c2c2c2;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#212121;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:#ff2400;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .task-name{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task{background:#F0EFD1;border:1px solid #000;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#000;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#212121}.kanban-task.blocked{background:#ff2400;border:1px solid #cc1d00;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.kanban-task .kanban-tagline{border-color:#000;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #000;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #000;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#000;display:block}.kanban-task .task-num{color:#212121;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#000;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#000;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e8e8e8;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#e1e1e1;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#f5f5f5}.kanban-task-maximized .task-archived p{color:#f5f5f5;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#757575;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#000;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e8e8e8;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#f5f5f5}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-itemtype-project .icon svg,.list-itemtype-ticket .icon svg,.list-itemtype-timeline .icon svg,.list-itemtype-user .icon svg,.loading-spinner{max-height:1rem;max-width:1rem}.kanban-task-minimized .task-archived p{color:#f5f5f5;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#f5f5f5;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-weight:400;font-family:opensans-regular,Arial,Helvetica,sans-serif}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#000}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #f5f5f5;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#000}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#f5f5f5}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#f5f5f5;margin-right:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#f5f5f5;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#000}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#000}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-data .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#757575;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#757575;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#ffc107}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#009688}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e91e63}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#9c27b0}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#cddc39}.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}a.help-button,a.help-markdown{font-size:.9rem;color:#f5f5f5}a.help-button:hover .icon,a.help-button:hover span,a.help-markdown:hover .icon,a.help-markdown:hover span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button .icon,a.help-markdown .icon{color:#f5f5f5;margin-right:.2rem}.markItUpHeader ul{background:#f5f5f5;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#f5f5f5;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(33,33,33,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-light,.notification-message-error{-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%)}.notification-message-error{background:rgba(255,36,0,.9);top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(245,245,245,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(255,36,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#f5f5f5;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span,.paginator a:hover{background:#212121}.paginator a:hover{color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .dots{background:0 0;color:#f5f5f5}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#757575;color:#f5f5f5;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#212121;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#212121;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{height:.5rem;width:.5rem}.private path{fill:#f5f5f5;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color,.select-color a{font-size:.9rem}.select-color input{font-weight:400;font-size:1rem}.select-color a{border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#f5f5f5;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background-color:#f5f5f5;width:243px}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#f5f5f5;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.empty-burndown,.empty-burndown .title,.summary .description{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#212121}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#212121;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats.active .graph{fill:#000}.summary .stats svg{height:100%;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#c2c2c2;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#212121}.empty-burndown path,.track-button.active .track-icon path{fill:#000}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#212121;height:24px}.summary-progress-bar .defined-points{background:#ff0062;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#212121;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#000;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#212121}.large-summary .icon.icon-stats.active:hover{color:#000;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(0,0,0,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#000;margin:0}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-radius:0 5px 5px 0;color:#212121;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag .icon-delete{color:#f5f5f5;margin-left:1rem}.tag .icon-delete:hover{color:#ff2400}.ui-autocomplete{background:#fff;border:1px solid #f5f5f5;z-index:99910}.ui-autocomplete .ui-state-focus{background:#212121}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{padding:.4rem;width:14rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#f5f5f5}.tags-block .add-tag:hover{color:#212121}.taskboard-task .task-name{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task{background:#F0EFD1;border:1px solid #000;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#000;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#212121}.taskboard-task.blocked{background:#ff2400;border:1px solid #cc1d00;color:#fff}.taskboard-task.blocked a,.taskboard-task.blocked span,.taskboard-task.blocked:hover .icon-drag-h,.taskboard-task.blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.taskboard-task .taskboard-tagline{border-color:#000;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #000;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #000;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#000;display:block}.taskboard-task .task-assigned:hover{color:#000}.taskboard-task .task-num{color:#212121;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#000;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#000}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.watch-options a{font-weight:100}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#f5f5f5;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e8e8e8;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#212121}.track-button.active .track-inner{background:rgba(33,33,33,.2)}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#212121}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:#ff2400;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff0062}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.admin-project-export-result .spin img,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(245,245,245,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#212121}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#212121}.upvote-btn a.active path,.upvote-btn a:hover path{fill:#000}.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#f5f5f5;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#000;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a.active{background:rgba(33,33,33,.2);color:#000;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover{background:#ff2400;color:#f5f5f5}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff0062}.sprints .add-sprint path,.upvote-btn path{fill:#f5f5f5}.upvote-btn svg{height:1rem;width:1rem}.upvote-btn span{display:block}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{color:#212121;margin-left:.5rem}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem .5rem .3rem;vertical-align:middle}.assigned-to-list .user-list-single:last-child,.ticket-watchers .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar,.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.assigned-to-list .user-list-single:hover{background:#949494;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#8c8c8c;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.3rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-name{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:#ff2400;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem;margin-bottom:.5rem}.wysiwyg h1{font-weight:400;font-size:2rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-weight:800;font-family:opensans-semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;font-weight:700;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#000}.wysiwyg a:hover{color:#212121}.wysiwyg p{line-height:1.4rem;margin-bottom:1rem}.wysiwyg code,.wysiwyg pre{background:#3b3b3b;color:#f5f5f5;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #f5f5f5;margin-bottom:1rem}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#f5f5f5 1px solid}.wysiwyg th{border-right:#f5f5f5 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#f5f5f5 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{margin-bottom:2rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .delete,.admin-menu li{font-size:1.2rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .privacy-settings label,.project-details input,.project-details label,.project-details textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.project-details form{max-width:700px;width:100%}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details textarea{height:10rem}.project-details .privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.project-details .privacy-settings>div{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;position:relative}.project-details .privacy-settings>div:first-child{margin-right:.5rem}.project-details .privacy-settings label{border:1px solid #b8b8b8;cursor:not-allowed;display:block;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-details .privacy-settings label span{color:#b8b8b8}.project-details .privacy-project{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.project-details .privacy-project:checked+label{background:#9dce0a;border:1px solid #9dce0a}.project-details .privacy-project:checked+label span{color:#fff}.project-details .button-green{color:#fff;display:block;text-align:center}.project-details .delete-project{font-size:.9rem;display:block;margin-top:1rem}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.backlog-table-body,.backlog-table-header,.kanban-table,.taskboard-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:opensans-regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprints-empty a,.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-header .task-colum-name,.taskboard-userstory-box .us-title{font-size:1.2rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.attachments-header,.ticket-assigned-to{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.taskboard-userstory-box .us-title{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:1rem;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.attachments,.duty-custom-fields{margin-bottom:2rem}.ticket-assigned-to .user-avatar{-webkit-flex-basis:4rem;-ms-flex-preferred-size:4rem;flex-basis:4rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block}.attachments-header .attachments-title,.colors-table .table-header,.single-attachment .attachment-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .user-assigned{font-size:1.2rem;color:#72a114;cursor:default;line-height:1.5rem}.ticket-assigned-to .assigned-to .user-assigned.editable{cursor:pointer}.ticket-assigned-to .assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assigned-to .assigned-name{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.add-attach span,.more-attachments,.single-attachment,.single-attachment .editable-attachment-comment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#444}.attachments-header .icon,.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings,.single-attachment .icon-delete{font-size:1.2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.attachments-header .attachments-num,.attachments-header .attachments-text{margin-right:.1rem}.attachments-header .icon{color:#444;cursor:pointer}.attachments-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem 1rem;position:relative}.category-config,.more-attachments{border-bottom:1px solid #b8b8b8}.single-attachment:hover .attachment-settings .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.single-attachment.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.deprecated,.single-attachment.deprecated .attachment-name a{color:#b8b8b8}.single-attachment.sortable-placeholder{background:#f5f5f5;height:40px}.single-attachment .attachment-name{max-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.5rem}.single-attachment .attachment-size{color:#b8b8b8;-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem}.single-attachment .attachment-comments,.single-attachment .editable-attachment-comment{-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-comments span,.single-attachment .editable-attachment-comment span{color:#555}.single-attachment .attachment-settings{-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings{color:#b8b8b8;display:block;position:absolute}.single-attachment .attachment-settings .editable-settings:hover,.single-attachment .attachment-settings .settings:hover{color:#72a114}.single-attachment .attachment-settings .settings{opacity:0;top:.5rem}.single-attachment .attachment-settings .editable-settings{opacity:1;top:1rem}.single-attachment .attachment-settings .icon-edit,.single-attachment .attachment-settings .icon-floppy{right:3.5rem}.single-attachment .attachment-settings .icon-delete{right:2rem}.single-attachment .attachment-settings .icon-delete:hover{color:red}.single-attachment .attachment-settings .icon-drag-v{cursor:move;right:0}.single-attachment .icon-delete{color:#b8b8b8}.single-attachment .icon-delete:hover{color:red}.single-attachment .editable-attachment-deprecated{padding-left:1rem}.single-attachment .editable-attachment-deprecated span{color:#b8b8b8}.single-attachment .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.single-attachment .editable-attachment-deprecated input:checked+span{color:#444}.single-attachment .percentage{background:rgba(114,161,20,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.more-attachments{display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#72a114;margin-left:.5rem}.more-attachments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.add-attach{cursor:pointer;overflow:hidden;position:relative}.add-attach input{display:none}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.add-attach span{color:#b8b8b8}.attachment-preview img{max-height:95vh;max-width:95vw}.category-config:first-child{border-top:1px solid #b8b8b8}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition .current-color{cursor:pointer}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields form label{cursor:pointer}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;margin-bottom:.5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{margin-bottom:1rem;max-height:9rem;min-height:7rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-block textarea,.lightbox-create-issue textarea{min-height:8rem;max-height:12rem;margin-bottom:1rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list{right:.5rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.main-nav .active svg path,.main-nav svg path{opacity:1}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row,.related-tasks-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:flex}.main-nav a,.main-nav span{display:block}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .ticket-role-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;max-width:calc(100% * (1/5) - .2rem)}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(5n+5){margin-right:0}.lb-create-edit-userstory .points-per-role{margin-bottom:1rem}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;min-height:calc(100vh - 40px);padding:1rem 0}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper:after{background:#050505;content:'';height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:12px;z-index:98}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{color:#9dce0a}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a,.related-tasks-header .icon{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.related-tasks-header .icon{color:#444;cursor:pointer}.related-tasks-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.filters-inner .loading .loading-spinner,.ticket-detail-settings .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg)}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data .ticket-data-container,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .status-data .pop-status,.ticket-status .status-data .pop-status a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-track-buttons .track-inner{font-size:.9rem}.ticket-data .ticket-title span:last-child,.ticket-track-buttons .track-button-counter{font-size:1.2rem}.ticket-data .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .status-data .pop-status,.ticket-status .type-data .pop-type,.ticket-track-buttons .track-inner{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-detail-settings .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.ticket-data .ticket-title{font-size:1.6rem;margin:1.5rem 0 2rem}.ticket-data .ticket-title span{margin-right:.25rem}.ticket-data .ticket-data-container{margin-bottom:1rem}.ticket-data .ticket-data-container .icon{margin-left:.25rem}.ticket-data .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-data .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-data .ticket-estimation .ticket-role-points{max-width:25%}.ticket-data .ticket-estimation .ticket-role-points:first-child{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.ticket-status{margin-bottom:.5rem}.ticket-status:last-child{margin:0}.ticket-status div{background:#e8e8e8;padding:.5rem 1rem .5rem .5rem;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{position:relative}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .severity-data{position:relative}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .priority-data .pop-priority:after,.ticket-status .status-data .pop-status:after{background:#050505;height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);content:''}.ticket-status .priority-data{position:relative}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{position:absolute;transform:rotate(45deg);width:0}.ticket-status .status-data{position:relative}.ticket-status .status-data .pop-status{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .status-data .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .status-data .pop-status a:last-child{border:0}.ticket-status .status-data .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .status-data .pop-status a:hover.point{color:#fff}.ticket-status .status-data .pop-status:after{position:absolute;transform:rotate(45deg);width:0}.ticket-track-buttons .track-inner{background:#e8e8e8;padding:.25rem;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-track-buttons .track-inner:hover{background:#dcdcdc}.ticket-track-buttons .track-button{width:100%}.ticket-track-buttons .active .track-button-counter{background:rgba(68,68,68,.5)}.ticket-track-buttons .active:hover .track-inner{background:rgba(157,206,10,.2)}.ticket-track-buttons .active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-track-buttons .active.is-hover path{fill:#ff8282}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.ticket-track-buttons .track-button-counter{background:rgba(68,68,68,.25);color:#f5f5f5;padding:0 .5rem}.ticket-track-buttons .vote-button{margin-bottom:.3rem}.ticket-track-buttons .watch-button{border-bottom:0}.ticket-track-buttons .ticket-watchers{margin:.5rem 0}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-track-buttons .add-watcher{display:block;margin:.5rem}.ticket-track-buttons .add-watcher .icon{background:rgba(68,68,68,.25);color:#f5f5f5;margin-right:.5rem;padding:.25rem}.ticket-track-buttons .add-watcher:hover .icon{background:#9dce0a;color:#f5f5f5;-webkit-transition:background .3s linear;transition:background .3s linear}.ticket-detail-settings{margin-top:2rem}.ticket-detail-settings .button,.ticket-detail-settings label{display:block;margin-bottom:.5rem;text-align:center}.ticket-detail-settings .button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .button-gray,.ticket-detail-settings .button-gray:hover{background:#b8b8b8}.ticket-detail-settings .button-gray.editable:hover{background:#444;cursor:pointer}.ticket-detail-settings .button-gray.active{background:#72a114}.ticket-detail-settings .item-block.editable:hover{background:red;cursor:pointer}.ticket-detail-settings .button-red{display:block;margin-top:2rem}.wizard-create-project{background:url(/images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#f5f5f5}.create-project input::-moz-placeholder{color:#f5f5f5}.create-project input:-moz-placeholder{color:#f5f5f5}.create-project input:-ms-input-placeholder{color:#f5f5f5}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#212121}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-width:1rem}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .description{font-weight:100}.single-project .title{font-weight:800}.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{margin-bottom:2rem}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.single-project h1{color:#000;display:inline-block;line-height:1.2;margin-bottom:0;margin-right:3rem}.single-project .private{font-size:1rem;vertical-align:super}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#000}.single-project .track-container .icon svg{max-height:1rem;max-width:1rem}.single-project .project-data{display:flex}.single-project .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{margin-right:.14rem;width:24%}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1200px){.issues-table .created-field,.issues-table .level-field{display:none}}@media (max-width:767px){.issues-table .assigned-field,.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-body,.kanban-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-header .task-colum-name{font-size:1.2rem;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-inner,.search-filter ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:opensans-semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter a{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;opacity:.2}.search-filter ul{border-bottom:3px solid #b8b8b8;display:flex;padding-bottom:.5rem}.search-filter li{margin-right:1rem}.search-filter .active,.search-filter a:hover{color:#555;opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.search-filter .icon{margin-right:.4rem}.search-filter .name{padding-left:5px}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.search-result-table .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.user-change-password label,.user-profile label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile form .avatar-container p{font-size:.75rem}.user-profile .delete-account,.user-profile form .avatar-container .use-gravatar{font-size:.9rem}.user-profile form .avatar-container span{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.user-profile form .avatar-container .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem}.user-profile form{max-width:700px;width:100%}.user-profile form .container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile form .avatar-container{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:1rem}.user-profile form .avatar-container .image-container{position:relative}.user-profile form .avatar-container .avatar{border-radius:8%;width:100%}.user-profile form .avatar-container .overlay{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile form .avatar-container .loading-spinner{border:0;min-height:3rem;min-width:3rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.user-profile form .avatar-container p{line-height:.8rem;margin-bottom:.3rem;text-align:center}.user-profile form .avatar-container .use-gravatar{cursor:pointer;display:inline-block;text-align:center;width:100%}.user-profile form .data{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.user-profile fieldset{margin-bottom:1rem}.user-profile .submit{margin-top:2rem}.user-profile label{display:block;margin-bottom:.5rem}.user-profile textarea{min-height:7rem}.user-profile .button-green{color:#fff;cursor:pointer;display:block;padding:12px;text-align:center}.user-profile .delete-account{display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.wiki-nav li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center;width:100%}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#F0EFD1;border:1px solid #000;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single.blocked,.working-on .duty-single.blocked{background:rgba(255,130,130,.2);color:red}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project-list li a{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.empty-ticket,.home-project-list li a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project-list p{font-size:.75rem}.projects-empty p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.home-project-list h2,.home-project-list p{font-family:opensans-regular,Arial,Helvetica,sans-serif}.home-project-list li{border-radius:3px;cursor:pointer;margin-bottom:.75rem;padding:1rem;text-overflow:ellipsis}.home-project-list li:hover{border-color:#9dce0a;-webkit-transition:all .3s linear;transition:all .3s linear}.home-project-list li:hover p{color:#555;-webkit-transition:color .3s linear;transition:color .3s linear}.home-project-list li:hover .private path{fill:#555;-webkit-transition:fill .3s linear;transition:fill .3s linear}.home-project-list li a{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:5rem}.home-project-list h2{color:#555;font-size:1.5rem;line-height:1.3;margin-bottom:.5rem;text-transform:none}.home-project-list h2 .project-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.home-project-list p{line-height:125%;margin:0}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.navbar .nav-left>a path,.navbar a:hover svg path{fill:#fff}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar:after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-width:2rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#212121}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-width:1.2rem}.navbar svg path{fill:#fff;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(33,33,33,0);border-bottom-color:#212121}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#f5f5f5;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#212121}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.main-nav svg path,.navbar a svg path{fill:#fff}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(/images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{display:inline-block;padding:1rem 1.25rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar p{font-size:.9rem}.profile-sidebar h4{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a:hover,h1 .date,h2 .date,h3 .date,h4 .date,h5 .date,h6 .date{color:#000}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}.checksley-error-list{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}body{background:#fff}.extrabar,.master,.menu-secondary,.menu-tertiary{background:#fff;border-left:1px solid #000;border-right:1px solid #000}.master,.menu-secondary{background:#fff}.menu-tertiary{background-color:#fff}.extrabar{background:#fff}h1,h2,h3,h4,h5,h6{font-family:Arial,Helvetica,sans-serif}a{color:#212121}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#fff;border-color:#000;color:#000}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#000}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#000}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#000}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#000}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #ff2400}.checksley-error-list{background:rgba(255,36,0,.7);color:#fff}blockquote{border-left:5px solid #757575}blockquote,blockquote p,cite{color:#000}.navbar a :hover,.summary{color:#fff}.button-gray{background:#000}.tag{background:#fff;border:1px solid #000}.summary{background:#212121}.navbar{background:#000}.navbar:after{background:url(../images/menu-vert.png) top left}.activity-item p,.duty-custom-fields .custom-field-data .custom-field-description,.kanban-table-header .task-colum-name .icon,.points-per-role>li,.private path,.table-team .avatar .position,.taskboard-table-header .task-colum-name .icon,.us-created-by .created-by .created-date,.us-created-by .created-by .created-title,.watching .duty-id,.working-on .duty-id{color:#000}tg-project-menu{background-color:#000;background-image:none}.main-nav .active{background:#fff}.main-nav .active svg path{fill:#000}.taskboard-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.taskboard-table-body .taskboard-tasks-box{background:#fff;border:1px solid #000}.kanban-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.kanban-table-body .kanban-uses-box{background:#f5f5f5}.points-per-role>li:first-child{background:#000}.us-detail-settings .button-gray{background:0 0;border:1px solid #000;color:#000}.us-detail-settings .button-gray.active,.us-detail-settings .button-gray:hover{color:#fff}.history-tabs a,.more-attachments span,.us-detail-settings .button-gray span{color:#000}.login-main,.login-main a{color:#fff}.home-project-list li{border:1px solid #000}.home-project-list p{color:#000}.profile-content-tabs .tab,.profile-sidebar p{color:#212121}.settings-nav .active{background:#000;color:#fff}.admin-submenu ul a{color:#000}.policy-table input:checked+label{color:#fff}.policy-table label{color:#000}.policy-table label:hover{color:#fff}.admin-common .admin-subtitle,.admin-membership-table .avatar .email,.admin-membership-table .delete{color:#000}.admin-functionalities .functionality.active{background:#fff;border:1px solid #000} \ No newline at end of file diff --git a/dist/styles/theme-material-design.css b/dist/styles/theme-material-design.css index 1e50636..15d8639 100644 --- a/dist/styles/theme-material-design.css +++ b/dist/styles/theme-material-design.css @@ -1,4 +1,4 @@ -@charset "UTF-8";.introjs-arrow,blockquote:after,blockquote:before,q:after,q:before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.invitation-main .avatar,.kanban,.login-main{-webkit-box-direction:normal}.kanban-task-minimized .task-name,.ticket-estimation .ticket-role-points .role,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.home-project-list p,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;line-height:18px;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! +@charset "UTF-8";.introjs-arrow,blockquote:after,blockquote:before,q:after,q:before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.kanban-task-minimized .task-name,.ticket-estimation .ticket-role-points .role,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.home-project-list p,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;line-height:18px;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! * Pikaday * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-family:opensans-regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:4;-webkit-flex:4;-ms-flex:4;flex:4;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}fieldset,p img{margin:0}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h2{font-size:2rem}h1,h1 span{font-size:3rem}h1,h2{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg dl dt,strong{font-weight:700}h1{margin-bottom:1rem;text-transform:uppercase}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#3f51b5}h1 .date{max-width:500px;color:#bdbdbd}h2{line-height:1.2;margin-bottom:1rem}p{line-height:1.5}em{font-style:italic}[class*=' icon-']:before,[class^=icon-]:before,[data-icon]:before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]:before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug:before{content:'a'}.icon-copy:before{content:'b'}.icon-minimize:before{content:'c'}.icon-maximize:before{content:'d'}.icon-comment:before{content:'e'}.icon-plus:before{content:'f'}.icon-attachments:before{content:'g'}.icon-edit:before{content:'h'}.icon-documents:before{content:'i'}.icon-delete:before{content:'j'}.icon-arrow-bottom:before{content:'k'}.icon-arrow-left:before{content:'l'}.icon-arrow-right:before{content:'m'}.icon-arrow-up:before{content:'n'}.icon-briefcase:before{content:'o'}.icon-caret-down:before{content:'p'}.icon-caret-up:before{content:'q'}.icon-check-square:before{content:'r'}.icon-notification-error:before{content:'s'}.icon-settings:before{content:'t'}.icon-document:before{content:'u'}.icon-warning:before{content:'v'}.icon-move:before{content:'w'}.icon-drag-v:before{content:'x'}.icon-filter:before{content:'y'}.icon-help:before{content:'z'}.icon-reload:before{content:'A'}.icon-writer:before{content:'B'}.icon-stats:before{content:'C'}.icon-floppy:before{content:'D'}.icon-warning-alt:before{content:'E'}.icon-video:before{content:'F'}.icon-bulk:before{content:'G'}.icon-vunfold:before{content:'H'}.icon-tasks:before{content:'I'}.icon-kanban:before{content:'J'}.icon-search:before{content:'K'}.icon-wiki:before{content:'L'}.icon-team:before{content:'M'}.icon-vfold:before{content:'N'}.icon-issues:before{content:'O'}.icon-iocaine:before{content:'P'}.icon-archive:before{content:'Q'}.icon-capslock:before{content:'R'}.icon-upload:before{content:'S'}.icon-github:before{content:'T'}.icon-timeline:before{content:'U'}.icon-scrum:before{content:'V'}.icon-project:before{content:'W'}.icon-heart:before{content:'X'}.icon-eye:before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite:before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.blocked-warning .icon,.icon,.us-story-main-data .us-title.blocked{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}.pika-single{z-index:999999}.pika-single .pika-title{color:#424242}.pika-single .is-selected .pika-button{background:#3f51b5;border-radius:0!important;box-shadow:inset 0 1px 3px #3f51b5}.pika-single .is-today .pika-button{color:#3f51b5}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#8c9eff!important;border-radius:0!important;box-shadow:inset 0 1px 3px #8c9eff!important}fieldset{border:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#757575;display:none;position:absolute;right:1rem}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#bdbdbd}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.kanban,.taskboard{height:calc(100vh - 40px)}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.backlog-menu{background:#f5f5f5;color:#212121;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#212121;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#757575;color:#f5f5f5}.backlog-menu .trans-button.active:hover{background:#c2c2c2}.backlog-menu .trans-button.move-to-current-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(https://lh6.googleusercontent.com/-2l_mJ5g6j4k/VGdNZCpaERI/AAAAAAAAD2o/zCx5Z3cYv6Y/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B497) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.blocked-warning .blocked,.login-main .logo,.login-main .tagline,.us-story-main-data .us-title .us-number{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#bdbdbd;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#424242;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#3f51b5}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#3f51b5}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main,.login-main{bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;-webkit-box-orient:horizontal;position:fixed;right:0;top:0;z-index:999;left:0}.login-main{background:url(https://lh4.googleusercontent.com/-k7YewfrSQ_Q/VGdNZND0NBI/AAAAAAAAD1A/UDZBeSGR7iM/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B480) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.login-main .tagline{font-size:2rem}.login-main fieldset{margin-bottom:.5rem}.login-main .logo,.login-main form{margin-bottom:1rem}.login-main .login-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.login-main .logo-svg{padding:0 33%;text-align:center;width:100%}.login-main .logo{font-size:3rem;color:#fff;text-align:center}.login-main .tagline{color:#fff;line-height:2rem;margin-bottom:1rem;text-align:center;text-transform:uppercase}.login-main .login-text,.login-main .register-text{text-align:center}.login-main .login-text a:hover,.login-main .register-text a:hover{color:#8c9eff}.login-main .button{color:#fff;display:block;text-align:center}.login-main a:hover{color:#fff}.error-main{background:url(https://lh6.googleusercontent.com/-2l_mJ5g6j4k/VGdNZCpaERI/AAAAAAAAD2o/zCx5Z3cYv6Y/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B497) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.taskboard-inner,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table,.taskboard-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#3f51b5}.error-main a:hover{color:#8c9eff}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#3f51b5}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a,.us-story-main-data .us-title .us-name,.us-story-main-data .us-title .us-number{font-size:2rem}.us-story-main-data .us-title{font-family:opensans-regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:2rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{background:#f5f5f5;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:#f44336;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff5252}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff5252;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.basic-table,.us-story-main-data .us-title .us-title-text{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:9;-webkit-flex-grow:9;-ms-flex-positive:9;flex-grow:9}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:0;max-width:94%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#bdbdbd;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#424242;display:inline-block;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#bdbdbd;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#bdbdbd;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #bdbdbd;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#3f51b5}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:#f44336;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .block-description{color:#424242;margin:0}.duty-content .edit-description,.wiki-content,.wysiwyg{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.duty-content{position:relative}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#424242}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#bdbdbd}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#424242}.duty-content .view-description .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wysiwyg textarea{background:#fff;max-height:none}.wiki .remove{font-size:.9rem;color:#bdbdbd}.wiki .remove:hover span{color:#424242;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:#f44336;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#bdbdbd;margin-right:.2rem}.wiki-content{position:relative}.wiki-content.editable:hover .wysiwyg{background:#f5f5f5;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#424242;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row,.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #ebebeb;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#3f51b5}.trans-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#3f51b5}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#8c9eff;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#8c9eff;color:#fff}.button-blackish{background:#212121;color:#f5f5f5}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff5252}.button-red:hover{background:#f44336;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:#f44336}.button-block:hover{background:#ff5252;color:#fff}.button-bulk{background:#3f51b5;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-bulk:hover{background:#8c9eff}.button-auth{background:#424242}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#f0f0f0;border:1px dashed #e1e1e1;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#e1e1e1;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#e1e1e1;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#dcdcdc;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#757575;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:opensans-regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#8c9eff;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.single-filter,.ticket-created-by .created-by .created-title.editable{cursor:pointer}.check input:disabled+div{background-color:#bdbdbd}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;margin-top:.5rem;position:relative}.ticket-created-by .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;line-height:1.5}.ticket-created-by .created-by .created-title{color:#3f51b5}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a,.ticket-estimation .ticket-role-points .role{font-size:.9rem}.ticket-estimation .ticket-role-points .points{font-size:1.6rem}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .points-per-role{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ticket-estimation .ticket-role-points{background:rgba(189,189,189,.1);border-radius:2px;color:rgba(66,66,66,.3);-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:.1rem;padding:.5rem 0 .1rem;position:relative;text-align:center;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.active{background:rgba(140,158,255,.9);color:#f5f5f5}.ticket-estimation .ticket-role-points:first-child{background:rgba(66,66,66,.25);border-radius:0;color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child{border:0}.ticket-estimation .ticket-role-points .points{font-family:opensans-regular,Arial,Helvetica,sans-serif;display:block;text-align:center}.ticket-estimation .ticket-role-points .role{max-width:90%;overflow:hidden;display:inline-block;text-align:center}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:35%;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#8c9eff;color:#fff}.ticket-estimation .popover.fix{background:#212121;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#424242;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#dcdcdc;display:block;width:100%}.single-filter .number{background:#c2c2c2;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#424242;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:#f44336;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task .task-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.kanban-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#424242}.kanban-task.blocked{background:#f44336;border:1px solid #ea1c0d;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.kanban-task .kanban-tagline{border-color:#f1e8cd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #3f51b5;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#cfc29b;display:block}.kanban-task .task-num{color:#424242;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#f1e8cd;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#e0cd91;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e8e8e8;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#e1e1e1;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#bdbdbd}.kanban-task-maximized .task-archived p{color:#bdbdbd;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#757575;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#e0cd91;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e8e8e8;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#bdbdbd}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-itemtype-project .icon svg,.list-itemtype-ticket .icon svg,.list-itemtype-timeline .icon svg,.list-itemtype-user .icon svg,.loading-spinner{max-height:1rem;max-width:1rem}.kanban-task-minimized .task-archived p{color:#bdbdbd;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#bdbdbd;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-family:opensans-regular,Arial,Helvetica,sans-serif}.list-itemtype-project{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#bdbdbd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #f5f5f5;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#bdbdbd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#bdbdbd}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#bdbdbd;margin-right:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#bdbdbd;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#bdbdbd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-data .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#757575;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#757575;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#ffc107}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#009688}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e91e63}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#9c27b0}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#cddc39}.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}a.help-button,a.help-markdown{font-size:.9rem;color:#bdbdbd}a.help-button:hover span,a.help-markdown:hover span{color:#424242;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button:hover .icon,a.help-markdown:hover .icon{color:#8c9eff;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button .icon,a.help-markdown .icon{color:#bdbdbd;margin-right:.2rem}.markItUpHeader ul{background:#f5f5f5;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#f5f5f5;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(140,158,255,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-light,.notification-message-error{-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%)}.notification-message-error{background:rgba(244,67,54,.9);top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(189,189,189,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(244,67,54,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#bdbdbd;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator a:hover{background:#212121;color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span{background:#8c9eff}.paginator .dots{background:0 0;color:#bdbdbd}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#757575;color:#f5f5f5;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#212121;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#212121;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{height:.5rem;width:.5rem}.private path{fill:#bdbdbd;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color,.select-color a{font-size:.9rem}.select-color input{font-size:1rem}.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color a{border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#bdbdbd;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background-color:#f5f5f5;width:243px}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#bdbdbd;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.empty-burndown,.empty-burndown .title,.summary .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#8c9eff}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#8c9eff;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats.active .graph{fill:#3f51b5}.summary .stats svg{height:100%;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#8a8a8a;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#424242}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#8c9eff;height:24px}.summary-progress-bar .defined-points{background:#ff5252;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#8c9eff;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#3f51b5;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#8c9eff}.large-summary .icon.icon-stats.active:hover{color:#3f51b5;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(26,35,126,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#1a237e;margin:0}.empty-burndown path{fill:#1a237e}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#424242;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-delete{color:#bdbdbd;margin-left:1rem}.tag .icon-delete:hover{color:#f44336}.ui-autocomplete{background:#fff;border:1px solid #bdbdbd;z-index:99910}.ui-autocomplete .ui-state-focus{background:#8c9eff}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{padding:.4rem;width:14rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#bdbdbd}.tags-block .add-tag:hover{color:#8c9eff}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task .task-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.taskboard-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#424242}.taskboard-task.blocked{background:#f44336;border:1px solid #ea1c0d;color:#fff}.taskboard-task.blocked a,.taskboard-task.blocked span,.taskboard-task.blocked:hover .icon-drag-h,.taskboard-task.blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.taskboard-task .taskboard-tagline{border-color:#f1e8cd;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #3f51b5;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#cfc29b;display:block}.taskboard-task .task-assigned:hover{color:#3f51b5}.taskboard-task .task-num{color:#424242;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#f1e8cd;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#cfc29b}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#f5f5f5;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e8e8e8;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#212121}.track-button.active .track-inner{background:rgba(140,158,255,.2)}.track-button.active .track-icon path{fill:#3f51b5}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#424242}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:#f44336;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff5252}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.admin-project-export-result .spin img,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(189,189,189,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#8c9eff}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#8c9eff}.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#bdbdbd;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#1a237e;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a:hover path{fill:#1a237e}.upvote-btn a.active{background:rgba(140,158,255,.2);color:#3f51b5;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.active path{fill:#3f51b5}.upvote-btn a.is-hover{background:#f44336;color:#f5f5f5}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff5252}.upvote-btn svg{height:1rem;width:1rem}.upvote-btn span{display:block}.upvote-btn path{fill:#bdbdbd}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#424242;margin-left:.5rem}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem .5rem .3rem;vertical-align:middle}.assigned-to-list .user-list-single:last-child,.ticket-watchers .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar,.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.assigned-to-list .user-list-single:hover{background:#fff;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#fff;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.3rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-name{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:#f44336;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem;margin-bottom:.5rem}.wysiwyg h1{font-size:2rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#3f51b5}.wysiwyg a:hover{color:#8c9eff}.wysiwyg p{line-height:1.4rem;margin-bottom:1rem}.wysiwyg code,.wysiwyg pre{background:#5c5c5c;color:#f5f5f5;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #bdbdbd;margin-bottom:1rem}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#bdbdbd 1px solid}.wysiwyg th{border-right:#bdbdbd 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#bdbdbd 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#b8b8b8;margin-bottom:2rem}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .avatar .email{color:#b8b8b8}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete{font-size:1.2rem;color:#b8b8b8}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .privacy-settings label,.project-details input,.project-details label,.project-details textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.project-details form{max-width:700px;width:100%}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details textarea{height:10rem}.project-details .privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.project-details .privacy-settings>div{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;position:relative}.project-details .privacy-settings>div:first-child{margin-right:.5rem}.project-details .privacy-settings label{border:1px solid #b8b8b8;cursor:not-allowed;display:block;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-details .privacy-settings label span{color:#b8b8b8}.project-details .privacy-project{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.project-details .privacy-project:checked+label{background:#9dce0a;border:1px solid #9dce0a}.project-details .privacy-project:checked+label span{color:#fff}.project-details .button-green{color:#fff;display:block;text-align:center}.project-details .delete-project{font-size:.9rem;display:block;margin-top:1rem}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.backlog-table-body,.backlog-table-header,.kanban-table,.taskboard-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:opensans-regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprints-empty a,.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-header .task-colum-name,.taskboard-userstory-box .us-title{font-size:1.2rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.attachments-header,.ticket-assigned-to{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.taskboard-userstory-box .us-title{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:1rem;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.attachments,.duty-custom-fields{margin-bottom:2rem}.ticket-assigned-to .user-avatar{-webkit-flex-basis:4rem;-ms-flex-preferred-size:4rem;flex-basis:4rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block}.attachments-header .attachments-title,.colors-table .table-header,.single-attachment .attachment-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .user-assigned{font-size:1.2rem;color:#72a114;cursor:default;line-height:1.5rem}.ticket-assigned-to .assigned-to .user-assigned.editable{cursor:pointer}.ticket-assigned-to .assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assigned-to .assigned-name{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.add-attach span,.more-attachments,.single-attachment,.single-attachment .editable-attachment-comment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#444}.attachments-header .icon,.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings,.single-attachment .icon-delete{font-size:1.2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.attachments-header .attachments-num,.attachments-header .attachments-text{margin-right:.1rem}.attachments-header .icon{color:#444;cursor:pointer}.attachments-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem 1rem;position:relative}.category-config,.more-attachments{border-bottom:1px solid #b8b8b8}.single-attachment:hover .attachment-settings .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.single-attachment.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.deprecated,.single-attachment.deprecated .attachment-name a{color:#b8b8b8}.single-attachment.sortable-placeholder{background:#f5f5f5;height:40px}.single-attachment .attachment-name{max-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.5rem}.single-attachment .attachment-size{color:#b8b8b8;-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem}.single-attachment .attachment-comments,.single-attachment .editable-attachment-comment{-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-comments span,.single-attachment .editable-attachment-comment span{color:#555}.single-attachment .attachment-settings{-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings{color:#b8b8b8;display:block;position:absolute}.single-attachment .attachment-settings .editable-settings:hover,.single-attachment .attachment-settings .settings:hover{color:#72a114}.single-attachment .attachment-settings .settings{opacity:0;top:.5rem}.single-attachment .attachment-settings .editable-settings{opacity:1;top:1rem}.single-attachment .attachment-settings .icon-edit,.single-attachment .attachment-settings .icon-floppy{right:3.5rem}.single-attachment .attachment-settings .icon-delete{right:2rem}.single-attachment .attachment-settings .icon-delete:hover{color:red}.single-attachment .attachment-settings .icon-drag-v{cursor:move;right:0}.single-attachment .icon-delete{color:#b8b8b8}.single-attachment .icon-delete:hover{color:red}.single-attachment .editable-attachment-deprecated{padding-left:1rem}.single-attachment .editable-attachment-deprecated span{color:#b8b8b8}.single-attachment .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.single-attachment .editable-attachment-deprecated input:checked+span{color:#444}.single-attachment .percentage{background:rgba(114,161,20,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.more-attachments{display:block;padding:1rem 0 1rem 1rem}.more-attachments span{color:#b8b8b8}.more-attachments .more-attachments-num{color:#72a114;margin-left:.5rem}.more-attachments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.add-attach{cursor:pointer;overflow:hidden;position:relative}.add-attach input{display:none}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.add-attach span{color:#b8b8b8}.attachment-preview img{max-height:95vh;max-width:95vw}.category-config:first-child{border-top:1px solid #b8b8b8}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition .current-color{cursor:pointer}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields form label{cursor:pointer}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{color:#b8b8b8;padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;margin-bottom:.5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{margin-bottom:1rem;max-height:9rem;min-height:7rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-block textarea,.lightbox-create-issue textarea{min-height:8rem;max-height:12rem;margin-bottom:1rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list{right:.5rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row,.related-tasks-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:flex}.main-nav a,.main-nav span{display:block}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .ticket-role-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;max-width:calc(100% * (1/5) - .2rem)}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(5n+5){margin-right:0}.lb-create-edit-userstory .points-per-role{margin-bottom:1rem}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;min-height:calc(100vh - 40px);padding:1rem 0}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper:after{background:#050505;content:'';height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a,.related-tasks-header .icon{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.related-tasks-header .icon{color:#444;cursor:pointer}.related-tasks-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.filters-inner .loading .loading-spinner,.ticket-detail-settings .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg)}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data .ticket-data-container,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .status-data .pop-status,.ticket-status .status-data .pop-status a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-track-buttons .track-inner{font-size:.9rem}.ticket-data .ticket-title span:last-child,.ticket-track-buttons .track-button-counter{font-size:1.2rem}.ticket-data .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .status-data .pop-status,.ticket-status .type-data .pop-type,.ticket-track-buttons .track-inner{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-detail-settings .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.ticket-data .ticket-title{font-size:1.6rem;margin:1.5rem 0 2rem}.ticket-data .ticket-title span{margin-right:.25rem}.ticket-data .ticket-data-container{margin-bottom:1rem}.ticket-data .ticket-data-container .icon{margin-left:.25rem}.ticket-data .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-data .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-data .ticket-estimation .ticket-role-points{max-width:25%}.ticket-data .ticket-estimation .ticket-role-points:first-child{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.ticket-status{margin-bottom:.5rem}.ticket-status:last-child{margin:0}.ticket-status div{background:#e8e8e8;padding:.5rem 1rem .5rem .5rem;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{position:relative}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .severity-data{position:relative}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .priority-data .pop-priority:after,.ticket-status .status-data .pop-status:after{background:#050505;height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);content:''}.ticket-status .priority-data{position:relative}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{position:absolute;transform:rotate(45deg);width:0}.ticket-status .status-data{position:relative}.ticket-status .status-data .pop-status{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .status-data .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .status-data .pop-status a:last-child{border:0}.ticket-status .status-data .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .status-data .pop-status a:hover.point{color:#fff}.ticket-status .status-data .pop-status:after{position:absolute;transform:rotate(45deg);width:0}.ticket-track-buttons .track-inner{background:#e8e8e8;padding:.25rem;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-track-buttons .track-inner:hover{background:#dcdcdc}.ticket-track-buttons .track-button{width:100%}.ticket-track-buttons .active .track-button-counter{background:rgba(68,68,68,.5)}.ticket-track-buttons .active:hover .track-inner{background:rgba(157,206,10,.2)}.ticket-track-buttons .active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-track-buttons .active.is-hover path{fill:#ff8282}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.ticket-track-buttons .track-button-counter{background:rgba(68,68,68,.25);color:#f5f5f5;padding:0 .5rem}.ticket-track-buttons .vote-button{margin-bottom:.3rem}.ticket-track-buttons .watch-button{border-bottom:0}.ticket-track-buttons .ticket-watchers{margin:.5rem 0}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-track-buttons .add-watcher{display:block;margin:.5rem}.ticket-track-buttons .add-watcher .icon{background:rgba(68,68,68,.25);color:#f5f5f5;margin-right:.5rem;padding:.25rem}.ticket-track-buttons .add-watcher:hover .icon{background:#9dce0a;color:#f5f5f5;-webkit-transition:background .3s linear;transition:background .3s linear}.ticket-detail-settings{margin-top:2rem}.ticket-detail-settings .button,.ticket-detail-settings label{display:block;margin-bottom:.5rem;text-align:center}.ticket-detail-settings .button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .button-gray,.ticket-detail-settings .button-gray:hover{background:#b8b8b8}.ticket-detail-settings .button-gray.editable:hover{background:#444;cursor:pointer}.ticket-detail-settings .button-gray.active{background:#72a114}.ticket-detail-settings .item-block.editable:hover{background:red;cursor:pointer}.ticket-detail-settings .button-red{display:block;margin-top:2rem}.wizard-create-project{background:url(/images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(https://lh4.googleusercontent.com/-k7YewfrSQ_Q/VGdNZND0NBI/AAAAAAAAD1A/UDZBeSGR7iM/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B480) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#bdbdbd}.create-project input::-moz-placeholder{color:#bdbdbd}.create-project input:-moz-placeholder{color:#bdbdbd}.create-project input:-ms-input-placeholder{color:#bdbdbd}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#8c9eff}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-width:1rem}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{margin-bottom:2rem}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.single-project h1{color:#3f51b5;display:inline-block;line-height:1.2;margin-bottom:0;margin-right:3rem}.single-project .private{font-size:1rem;vertical-align:super}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#bdbdbd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#3f51b5}.single-project .track-container .icon svg{max-height:1rem;max-width:1rem}.single-project .project-data{display:flex}.single-project .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{margin-right:.14rem;width:24%}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1200px){.issues-table .created-field,.issues-table .level-field{display:none}}@media (max-width:767px){.issues-table .assigned-field,.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-body,.kanban-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-header .task-colum-name{font-size:1.2rem;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-inner,.search-filter ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:opensans-semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter a{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;opacity:.2}.search-filter ul{border-bottom:3px solid #b8b8b8;display:flex;padding-bottom:.5rem}.search-filter li{margin-right:1rem}.search-filter .active,.search-filter a:hover{color:#555;opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.search-filter .icon{margin-right:.4rem}.search-filter .name{padding-left:5px}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.search-result-table .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .position{color:#b8b8b8}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.user-change-password label,.user-profile label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile form .avatar-container p{font-size:.75rem}.user-profile .delete-account,.user-profile form .avatar-container .use-gravatar{font-size:.9rem}.user-profile form .avatar-container span{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.user-profile form .avatar-container .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem}.user-profile form{max-width:700px;width:100%}.user-profile form .container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile form .avatar-container{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:1rem}.user-profile form .avatar-container .image-container{position:relative}.user-profile form .avatar-container .avatar{border-radius:8%;width:100%}.user-profile form .avatar-container .overlay{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile form .avatar-container .loading-spinner{border:0;min-height:3rem;min-width:3rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.user-profile form .avatar-container p{line-height:.8rem;margin-bottom:.3rem;text-align:center}.user-profile form .avatar-container .use-gravatar{cursor:pointer;display:inline-block;text-align:center;width:100%}.user-profile form .data{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.user-profile fieldset{margin-bottom:1rem}.user-profile .submit{margin-top:2rem}.user-profile label{display:block;margin-bottom:.5rem}.user-profile textarea{min-height:7rem}.user-profile .button-green{color:#fff;cursor:pointer;display:block;padding:12px;text-align:center}.user-profile .delete-account{display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.wiki-nav li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center;width:100%}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single.blocked,.working-on .duty-single.blocked{background:rgba(255,130,130,.2);color:red}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project-list li a{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.empty-ticket,.home-project-list li a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project-list p{font-size:.75rem}.projects-empty p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.home-project-list h2,.home-project-list p{font-family:opensans-regular,Arial,Helvetica,sans-serif}.home-project-list li{border:1px solid #dedede;border-radius:3px;cursor:pointer;margin-bottom:.75rem;padding:1rem;text-overflow:ellipsis}.home-project-list li:hover{border-color:#9dce0a;-webkit-transition:all .3s linear;transition:all .3s linear}.home-project-list li:hover p{color:#555;-webkit-transition:color .3s linear;transition:color .3s linear}.home-project-list li:hover .private path{fill:#555;-webkit-transition:fill .3s linear;transition:fill .3s linear}.home-project-list li a{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:5rem}.home-project-list h2{color:#555;font-size:1.5rem;line-height:1.3;margin-bottom:.5rem;text-transform:none}.home-project-list h2 .project-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.home-project-list p{color:#b8b8b8;line-height:125%;margin:0}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar:after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-width:2rem}.navbar .nav-left>a path{fill:#fff}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a svg path{fill:#131a5c}.navbar a:hover{background:rgba(0,0,0,.2);color:#8c9eff}.navbar a:hover svg path{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-width:1.2rem}.navbar svg path{fill:#fff;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(33,33,33,0);border-bottom-color:#212121}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#bdbdbd;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#8c9eff}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(/images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#b8b8b8;display:inline-block;padding:1rem 1.25rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar h4{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar p{font-size:.9rem;color:#b8b8b8}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.master,body{background:#fff}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a,body{color:#424242}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}.menu-secondary{background:#fcfdff}.menu-tertiary{background-color:#1a237e}.extrabar{background:#fcfdff}h1,h2,h3,h4,h5,h6{color:#212121}a:hover{color:#3f51b5}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#3f51b5;color:#424242}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a4a4a4}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#a4a4a4}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#a4a4a4}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a4a4a4}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #f44336}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);color:#fff}blockquote{border-left:5px solid #8c9eff}blockquote,blockquote p,cite{color:#757575}.summary{background:#424242;color:#fff}.kanban-table-header .task-colum-name .icon,.taskboard-table-header .task-colum-name .icon{color:#3f51b5}.navbar{background:rgba(233,30,99,.6)}.navbar:after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#0d113f;background-image:none}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f2f4ff;border-top:3px solid #3f51b5}.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.kanban-table-header .task-colum-name{background:#f2f4ff;border-top:3px solid #3f51b5}.kanban-table-body .kanban-uses-box{background:#f5f5f5} \ No newline at end of file + */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-family:opensans-regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:4;-webkit-flex:4;-ms-flex:4;flex:4;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}fieldset,p img{margin:0}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h2{font-size:2rem}h1,h1 span{font-size:3rem}h1,h2{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg dl dt,strong{font-weight:700}h1{margin-bottom:1rem;text-transform:uppercase}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#3f51b5}h1 .date{max-width:500px;color:#bdbdbd}h2{line-height:1.2;margin-bottom:1rem}p{line-height:1.5}em{font-style:italic}[class*=' icon-']:before,[class^=icon-]:before,[data-icon]:before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]:before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug:before{content:'a'}.icon-copy:before{content:'b'}.icon-minimize:before{content:'c'}.icon-maximize:before{content:'d'}.icon-comment:before{content:'e'}.icon-plus:before{content:'f'}.icon-attachments:before{content:'g'}.icon-edit:before{content:'h'}.icon-documents:before{content:'i'}.icon-delete:before{content:'j'}.icon-arrow-bottom:before{content:'k'}.icon-arrow-left:before{content:'l'}.icon-arrow-right:before{content:'m'}.icon-arrow-up:before{content:'n'}.icon-briefcase:before{content:'o'}.icon-caret-down:before{content:'p'}.icon-caret-up:before{content:'q'}.icon-check-square:before{content:'r'}.icon-notification-error:before{content:'s'}.icon-settings:before{content:'t'}.icon-document:before{content:'u'}.icon-warning:before{content:'v'}.icon-move:before{content:'w'}.icon-drag-v:before{content:'x'}.icon-filter:before{content:'y'}.icon-help:before{content:'z'}.icon-reload:before{content:'A'}.icon-writer:before{content:'B'}.icon-stats:before{content:'C'}.icon-floppy:before{content:'D'}.icon-warning-alt:before{content:'E'}.icon-video:before{content:'F'}.icon-bulk:before{content:'G'}.icon-vunfold:before{content:'H'}.icon-tasks:before{content:'I'}.icon-kanban:before{content:'J'}.icon-search:before{content:'K'}.icon-wiki:before{content:'L'}.icon-team:before{content:'M'}.icon-vfold:before{content:'N'}.icon-issues:before{content:'O'}.icon-iocaine:before{content:'P'}.icon-archive:before{content:'Q'}.icon-capslock:before{content:'R'}.icon-upload:before{content:'S'}.icon-github:before{content:'T'}.icon-timeline:before{content:'U'}.icon-scrum:before{content:'V'}.icon-project:before{content:'W'}.icon-heart:before{content:'X'}.icon-eye:before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite:before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.blocked-warning .icon,.icon,.us-story-main-data .us-title.blocked{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}.pika-single{z-index:999999}.pika-single .pika-title{color:#424242}.pika-single .is-selected .pika-button{background:#3f51b5;border-radius:0!important;box-shadow:inset 0 1px 3px #3f51b5}.pika-single .is-today .pika-button{color:#3f51b5}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#8c9eff!important;border-radius:0!important;box-shadow:inset 0 1px 3px #8c9eff!important}fieldset{border:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#757575;display:none;position:absolute;right:1rem}.auth,.error-main{bottom:0;z-index:999;left:0}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#bdbdbd}.auth .logo,.auth .tagline{color:#fff;text-align:center}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.kanban,.taskboard{height:calc(100vh - 40px)}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(https://lh4.googleusercontent.com/-k7YewfrSQ_Q/VGdNZND0NBI/AAAAAAAAD1A/UDZBeSGR7iM/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B480) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth .logo{font-size:3rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.auth .auth-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{padding:0 33%;text-align:center;width:100%}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{text-align:center}.auth .login-text a:hover,.auth .register-text a:hover{color:#8c9eff}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moustache;animation-name:moustache;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;fill:rgba(63,81,181,.9);stroke:#8c9eff;stroke-width:1px;-webkit-transform-origin:50% 20%;-ms-transform-origin:50% 20%;transform-origin:50% 20%;-webkit-transition:.3s;transition:.3s}.moustache:hover{fill:rgba(140,158,255,.9);-webkit-transition:.3s;transition:.3s}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}@-webkit-keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}.backlog-menu{background:#f5f5f5;color:#212121;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#212121;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#757575;color:#f5f5f5}.backlog-menu .trans-button.active:hover{background:#c2c2c2}.backlog-menu .trans-button.move-to-current-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(https://lh6.googleusercontent.com/-2l_mJ5g6j4k/VGdNZCpaERI/AAAAAAAAD2o/zCx5Z3cYv6Y/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B497) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#bdbdbd;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#424242;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#3f51b5}.invitation-main .button-auth{display:block}.error-main,.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.invitation-main .button-blackish:hover{background:#3f51b5}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main{background:url(https://lh6.googleusercontent.com/-2l_mJ5g6j4k/VGdNZCpaERI/AAAAAAAAD2o/zCx5Z3cYv6Y/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B497) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.taskboard-inner,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table,.taskboard-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#3f51b5}.error-main a:hover{color:#8c9eff}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#3f51b5}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a,.us-story-main-data .us-title .us-name,.us-story-main-data .us-title .us-number{font-size:2rem}.blocked-warning .blocked,.us-story-main-data .us-title .us-number{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.us-story-main-data .us-title{font-family:opensans-regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:2rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{background:#f5f5f5;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:#f44336;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff5252}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff5252;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.basic-table,.us-story-main-data .us-title .us-title-text{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:9;-webkit-flex-grow:9;-ms-flex-positive:9;flex-grow:9}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:0;max-width:94%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#bdbdbd;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#424242;display:inline-block;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#bdbdbd;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#bdbdbd;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #bdbdbd;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#3f51b5}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:#f44336;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .block-description{color:#424242;margin:0}.duty-content .edit-description,.wiki-content,.wysiwyg{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.duty-content{position:relative}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#424242}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#bdbdbd}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#424242}.duty-content .view-description .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wysiwyg textarea{background:#fff;max-height:none}.wiki .remove{font-size:.9rem;color:#bdbdbd}.wiki .remove:hover span{color:#424242;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:#f44336;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#bdbdbd;margin-right:.2rem}.wiki-content{position:relative}.wiki-content.editable:hover .wysiwyg{background:#f5f5f5;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#424242;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row,.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #ebebeb;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#3f51b5}.trans-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#3f51b5}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#8c9eff;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#8c9eff;color:#fff}.button-blackish{background:#212121;color:#f5f5f5}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff5252}.button-red:hover{background:#f44336;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:#f44336}.button-block:hover{background:#ff5252;color:#fff}.button-bulk{background:#3f51b5;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-bulk:hover{background:#8c9eff}.button-auth{background:#424242}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#f0f0f0;border:1px dashed #e1e1e1;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#e1e1e1;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#e1e1e1;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#dcdcdc;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#757575;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:opensans-regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#8c9eff;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.single-filter,.ticket-created-by .created-by .created-title.editable{cursor:pointer}.check input:disabled+div{background-color:#bdbdbd}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;margin-top:.5rem;position:relative}.ticket-created-by .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;line-height:1.5}.ticket-created-by .created-by .created-title{color:#3f51b5}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a,.ticket-estimation .ticket-role-points .role{font-size:.9rem}.ticket-estimation .ticket-role-points .points{font-size:1.6rem}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .points-per-role{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ticket-estimation .ticket-role-points{background:rgba(189,189,189,.1);border-radius:2px;color:rgba(66,66,66,.3);-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:.1rem;padding:.5rem 0 .1rem;position:relative;text-align:center;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.active{background:rgba(140,158,255,.9);color:#f5f5f5}.ticket-estimation .ticket-role-points:first-child{background:rgba(66,66,66,.25);border-radius:0;color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child{border:0}.ticket-estimation .ticket-role-points .points{font-family:opensans-regular,Arial,Helvetica,sans-serif;display:block;text-align:center}.ticket-estimation .ticket-role-points .role{max-width:90%;overflow:hidden;display:inline-block;text-align:center}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:35%;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#8c9eff;color:#fff}.ticket-estimation .popover.fix{background:#212121;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#424242;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#dcdcdc;display:block;width:100%}.single-filter .number{background:#c2c2c2;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#424242;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:#f44336;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task .task-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.kanban-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#424242}.kanban-task.blocked{background:#f44336;border:1px solid #ea1c0d;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.kanban-task .kanban-tagline{border-color:#f1e8cd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #3f51b5;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#cfc29b;display:block}.kanban-task .task-num{color:#424242;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#f1e8cd;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#e0cd91;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e8e8e8;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#e1e1e1;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#bdbdbd}.kanban-task-maximized .task-archived p{color:#bdbdbd;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#757575;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#e0cd91;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e8e8e8;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#bdbdbd}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-itemtype-project .icon svg,.list-itemtype-ticket .icon svg,.list-itemtype-timeline .icon svg,.list-itemtype-user .icon svg,.loading-spinner{max-height:1rem;max-width:1rem}.kanban-task-minimized .task-archived p{color:#bdbdbd;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#bdbdbd;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-family:opensans-regular,Arial,Helvetica,sans-serif}.list-itemtype-project{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#bdbdbd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #f5f5f5;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#bdbdbd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#bdbdbd}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#bdbdbd;margin-right:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#bdbdbd;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#bdbdbd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-data .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#757575;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#757575;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#ffc107}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#009688}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e91e63}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#9c27b0}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#cddc39}.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}a.help-button,a.help-markdown{font-size:.9rem;color:#bdbdbd}a.help-button:hover span,a.help-markdown:hover span{color:#424242;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button:hover .icon,a.help-markdown:hover .icon{color:#8c9eff;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button .icon,a.help-markdown .icon{color:#bdbdbd;margin-right:.2rem}.markItUpHeader ul{background:#f5f5f5;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#f5f5f5;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(140,158,255,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-light,.notification-message-error{-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%)}.notification-message-error{background:rgba(244,67,54,.9);top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(189,189,189,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(244,67,54,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#bdbdbd;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator a:hover{background:#212121;color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span{background:#8c9eff}.paginator .dots{background:0 0;color:#bdbdbd}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#757575;color:#f5f5f5;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#212121;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#212121;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{height:.5rem;width:.5rem}.private path{fill:#bdbdbd;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color,.select-color a{font-size:.9rem}.select-color input{font-size:1rem}.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color a{border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#bdbdbd;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background-color:#f5f5f5;width:243px}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#bdbdbd;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.empty-burndown,.empty-burndown .title,.summary .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#8c9eff}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#8c9eff;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats.active .graph{fill:#3f51b5}.summary .stats svg{height:100%;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#8a8a8a;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#424242}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#8c9eff;height:24px}.summary-progress-bar .defined-points{background:#ff5252;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#8c9eff;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#3f51b5;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#8c9eff}.large-summary .icon.icon-stats.active:hover{color:#3f51b5;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(26,35,126,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#1a237e;margin:0}.empty-burndown path{fill:#1a237e}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#424242;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-delete{color:#bdbdbd;margin-left:1rem}.tag .icon-delete:hover{color:#f44336}.ui-autocomplete{background:#fff;border:1px solid #bdbdbd;z-index:99910}.ui-autocomplete .ui-state-focus{background:#8c9eff}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{padding:.4rem;width:14rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#bdbdbd}.tags-block .add-tag:hover{color:#8c9eff}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task .task-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.taskboard-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#424242}.taskboard-task.blocked{background:#f44336;border:1px solid #ea1c0d;color:#fff}.taskboard-task.blocked a,.taskboard-task.blocked span,.taskboard-task.blocked:hover .icon-drag-h,.taskboard-task.blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.taskboard-task .taskboard-tagline{border-color:#f1e8cd;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #3f51b5;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#cfc29b;display:block}.taskboard-task .task-assigned:hover{color:#3f51b5}.taskboard-task .task-num{color:#424242;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#f1e8cd;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#cfc29b}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#f5f5f5;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e8e8e8;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#212121}.track-button.active .track-inner{background:rgba(140,158,255,.2)}.track-button.active .track-icon path{fill:#3f51b5}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#424242}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:#f44336;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff5252}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.admin-project-export-result .spin img,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(189,189,189,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#8c9eff}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#8c9eff}.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#bdbdbd;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#1a237e;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a:hover path{fill:#1a237e}.upvote-btn a.active{background:rgba(140,158,255,.2);color:#3f51b5;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.active path{fill:#3f51b5}.upvote-btn a.is-hover{background:#f44336;color:#f5f5f5}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff5252}.upvote-btn svg{height:1rem;width:1rem}.upvote-btn span{display:block}.upvote-btn path{fill:#bdbdbd}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#424242;margin-left:.5rem}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem .5rem .3rem;vertical-align:middle}.assigned-to-list .user-list-single:last-child,.ticket-watchers .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar,.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.assigned-to-list .user-list-single:hover{background:#fff;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#fff;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.3rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-name{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:#f44336;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem;margin-bottom:.5rem}.wysiwyg h1{font-size:2rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#3f51b5}.wysiwyg a:hover{color:#8c9eff}.wysiwyg p{line-height:1.4rem;margin-bottom:1rem}.wysiwyg code,.wysiwyg pre{background:#5c5c5c;color:#f5f5f5;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #bdbdbd;margin-bottom:1rem}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#bdbdbd 1px solid}.wysiwyg th{border-right:#bdbdbd 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#bdbdbd 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#b8b8b8;margin-bottom:2rem}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .avatar .email{color:#b8b8b8}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete{font-size:1.2rem;color:#b8b8b8}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .privacy-settings label,.project-details input,.project-details label,.project-details textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.project-details form{max-width:700px;width:100%}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details textarea{height:10rem}.project-details .privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.project-details .privacy-settings>div{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;position:relative}.project-details .privacy-settings>div:first-child{margin-right:.5rem}.project-details .privacy-settings label{border:1px solid #b8b8b8;cursor:not-allowed;display:block;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-details .privacy-settings label span{color:#b8b8b8}.project-details .privacy-project{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.project-details .privacy-project:checked+label{background:#9dce0a;border:1px solid #9dce0a}.project-details .privacy-project:checked+label span{color:#fff}.project-details .button-green{color:#fff;display:block;text-align:center}.project-details .delete-project{font-size:.9rem;display:block;margin-top:1rem}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.backlog-table-body,.backlog-table-header,.kanban-table,.taskboard-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:opensans-regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprints-empty a,.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-header .task-colum-name,.taskboard-userstory-box .us-title{font-size:1.2rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.attachments-header,.ticket-assigned-to{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.taskboard-userstory-box .us-title{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:1rem;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.attachments,.duty-custom-fields{margin-bottom:2rem}.ticket-assigned-to .user-avatar{-webkit-flex-basis:4rem;-ms-flex-preferred-size:4rem;flex-basis:4rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block}.attachments-header .attachments-title,.colors-table .table-header,.single-attachment .attachment-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .user-assigned{font-size:1.2rem;color:#72a114;cursor:default;line-height:1.5rem}.ticket-assigned-to .assigned-to .user-assigned.editable{cursor:pointer}.ticket-assigned-to .assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assigned-to .assigned-name{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.add-attach span,.more-attachments,.single-attachment,.single-attachment .editable-attachment-comment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#444}.attachments-header .icon,.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings,.single-attachment .icon-delete{font-size:1.2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.attachments-header .attachments-num,.attachments-header .attachments-text{margin-right:.1rem}.attachments-header .icon{color:#444;cursor:pointer}.attachments-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem 1rem;position:relative}.category-config,.more-attachments{border-bottom:1px solid #b8b8b8}.single-attachment:hover .attachment-settings .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.single-attachment.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.deprecated,.single-attachment.deprecated .attachment-name a{color:#b8b8b8}.single-attachment.sortable-placeholder{background:#f5f5f5;height:40px}.single-attachment .attachment-name{max-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.5rem}.single-attachment .attachment-size{color:#b8b8b8;-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem}.single-attachment .attachment-comments,.single-attachment .editable-attachment-comment{-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-comments span,.single-attachment .editable-attachment-comment span{color:#555}.single-attachment .attachment-settings{-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings{color:#b8b8b8;display:block;position:absolute}.single-attachment .attachment-settings .editable-settings:hover,.single-attachment .attachment-settings .settings:hover{color:#72a114}.single-attachment .attachment-settings .settings{opacity:0;top:.5rem}.single-attachment .attachment-settings .editable-settings{opacity:1;top:1rem}.single-attachment .attachment-settings .icon-edit,.single-attachment .attachment-settings .icon-floppy{right:3.5rem}.single-attachment .attachment-settings .icon-delete{right:2rem}.single-attachment .attachment-settings .icon-delete:hover{color:red}.single-attachment .attachment-settings .icon-drag-v{cursor:move;right:0}.single-attachment .icon-delete{color:#b8b8b8}.single-attachment .icon-delete:hover{color:red}.single-attachment .editable-attachment-deprecated{padding-left:1rem}.single-attachment .editable-attachment-deprecated span{color:#b8b8b8}.single-attachment .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.single-attachment .editable-attachment-deprecated input:checked+span{color:#444}.single-attachment .percentage{background:rgba(114,161,20,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.more-attachments{display:block;padding:1rem 0 1rem 1rem}.more-attachments span{color:#b8b8b8}.more-attachments .more-attachments-num{color:#72a114;margin-left:.5rem}.more-attachments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.add-attach{cursor:pointer;overflow:hidden;position:relative}.add-attach input{display:none}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.add-attach span{color:#b8b8b8}.attachment-preview img{max-height:95vh;max-width:95vw}.category-config:first-child{border-top:1px solid #b8b8b8}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition .current-color{cursor:pointer}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields form label{cursor:pointer}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{color:#b8b8b8;padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;margin-bottom:.5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{margin-bottom:1rem;max-height:9rem;min-height:7rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-block textarea,.lightbox-create-issue textarea{min-height:8rem;max-height:12rem;margin-bottom:1rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list{right:.5rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row,.related-tasks-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:flex}.main-nav a,.main-nav span{display:block}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .ticket-role-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;max-width:calc(100% * (1/5) - .2rem)}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(5n+5){margin-right:0}.lb-create-edit-userstory .points-per-role{margin-bottom:1rem}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;min-height:calc(100vh - 40px);padding:1rem 0}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper:after{background:#050505;content:'';height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a,.related-tasks-header .icon{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.related-tasks-header .icon{color:#444;cursor:pointer}.related-tasks-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.filters-inner .loading .loading-spinner,.ticket-detail-settings .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg)}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data .ticket-data-container,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .status-data .pop-status,.ticket-status .status-data .pop-status a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-track-buttons .track-inner{font-size:.9rem}.ticket-data .ticket-title span:last-child,.ticket-track-buttons .track-button-counter{font-size:1.2rem}.ticket-data .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .status-data .pop-status,.ticket-status .type-data .pop-type,.ticket-track-buttons .track-inner{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-detail-settings .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.ticket-data .ticket-title{font-size:1.6rem;margin:1.5rem 0 2rem}.ticket-data .ticket-title span{margin-right:.25rem}.ticket-data .ticket-data-container{margin-bottom:1rem}.ticket-data .ticket-data-container .icon{margin-left:.25rem}.ticket-data .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-data .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-data .ticket-estimation .ticket-role-points{max-width:25%}.ticket-data .ticket-estimation .ticket-role-points:first-child{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.ticket-status{margin-bottom:.5rem}.ticket-status:last-child{margin:0}.ticket-status div{background:#e8e8e8;padding:.5rem 1rem .5rem .5rem;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{position:relative}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .severity-data{position:relative}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .priority-data .pop-priority:after,.ticket-status .status-data .pop-status:after{background:#050505;height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);content:''}.ticket-status .priority-data{position:relative}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{position:absolute;transform:rotate(45deg);width:0}.ticket-status .status-data{position:relative}.ticket-status .status-data .pop-status{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .status-data .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .status-data .pop-status a:last-child{border:0}.ticket-status .status-data .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .status-data .pop-status a:hover.point{color:#fff}.ticket-status .status-data .pop-status:after{position:absolute;transform:rotate(45deg);width:0}.ticket-track-buttons .track-inner{background:#e8e8e8;padding:.25rem;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-track-buttons .track-inner:hover{background:#dcdcdc}.ticket-track-buttons .track-button{width:100%}.ticket-track-buttons .active .track-button-counter{background:rgba(68,68,68,.5)}.ticket-track-buttons .active:hover .track-inner{background:rgba(157,206,10,.2)}.ticket-track-buttons .active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-track-buttons .active.is-hover path{fill:#ff8282}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.ticket-track-buttons .track-button-counter{background:rgba(68,68,68,.25);color:#f5f5f5;padding:0 .5rem}.ticket-track-buttons .vote-button{margin-bottom:.3rem}.ticket-track-buttons .watch-button{border-bottom:0}.ticket-track-buttons .ticket-watchers{margin:.5rem 0}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-track-buttons .add-watcher{display:block;margin:.5rem}.ticket-track-buttons .add-watcher .icon{background:rgba(68,68,68,.25);color:#f5f5f5;margin-right:.5rem;padding:.25rem}.ticket-track-buttons .add-watcher:hover .icon{background:#9dce0a;color:#f5f5f5;-webkit-transition:background .3s linear;transition:background .3s linear}.ticket-detail-settings{margin-top:2rem}.ticket-detail-settings .button,.ticket-detail-settings label{display:block;margin-bottom:.5rem;text-align:center}.ticket-detail-settings .button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .button-gray,.ticket-detail-settings .button-gray:hover{background:#b8b8b8}.ticket-detail-settings .button-gray.editable:hover{background:#444;cursor:pointer}.ticket-detail-settings .button-gray.active{background:#72a114}.ticket-detail-settings .item-block.editable:hover{background:red;cursor:pointer}.ticket-detail-settings .button-red{display:block;margin-top:2rem}.wizard-create-project{background:url(/images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(https://lh4.googleusercontent.com/-k7YewfrSQ_Q/VGdNZND0NBI/AAAAAAAAD1A/UDZBeSGR7iM/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B480) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#bdbdbd}.create-project input::-moz-placeholder{color:#bdbdbd}.create-project input:-moz-placeholder{color:#bdbdbd}.create-project input:-ms-input-placeholder{color:#bdbdbd}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#8c9eff}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-width:1rem}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{margin-bottom:2rem}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.single-project h1{color:#3f51b5;display:inline-block;line-height:1.2;margin-bottom:0;margin-right:3rem}.single-project .private{font-size:1rem;vertical-align:super}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#bdbdbd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#3f51b5}.single-project .track-container .icon svg{max-height:1rem;max-width:1rem}.single-project .project-data{display:flex}.single-project .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{margin-right:.14rem;width:24%}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1200px){.issues-table .created-field,.issues-table .level-field{display:none}}@media (max-width:767px){.issues-table .assigned-field,.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-body,.kanban-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-header .task-colum-name{font-size:1.2rem;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-inner,.search-filter ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:opensans-semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter a{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;opacity:.2}.search-filter ul{border-bottom:3px solid #b8b8b8;display:flex;padding-bottom:.5rem}.search-filter li{margin-right:1rem}.search-filter .active,.search-filter a:hover{color:#555;opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.search-filter .icon{margin-right:.4rem}.search-filter .name{padding-left:5px}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.search-result-table .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .position{color:#b8b8b8}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.user-change-password label,.user-profile label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile form .avatar-container p{font-size:.75rem}.user-profile .delete-account,.user-profile form .avatar-container .use-gravatar{font-size:.9rem}.user-profile form .avatar-container span{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.user-profile form .avatar-container .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem}.user-profile form{max-width:700px;width:100%}.user-profile form .container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile form .avatar-container{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:1rem}.user-profile form .avatar-container .image-container{position:relative}.user-profile form .avatar-container .avatar{border-radius:8%;width:100%}.user-profile form .avatar-container .overlay{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile form .avatar-container .loading-spinner{border:0;min-height:3rem;min-width:3rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.user-profile form .avatar-container p{line-height:.8rem;margin-bottom:.3rem;text-align:center}.user-profile form .avatar-container .use-gravatar{cursor:pointer;display:inline-block;text-align:center;width:100%}.user-profile form .data{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.user-profile fieldset{margin-bottom:1rem}.user-profile .submit{margin-top:2rem}.user-profile label{display:block;margin-bottom:.5rem}.user-profile textarea{min-height:7rem}.user-profile .button-green{color:#fff;cursor:pointer;display:block;padding:12px;text-align:center}.user-profile .delete-account{display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.wiki-nav li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center;width:100%}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single.blocked,.working-on .duty-single.blocked{background:rgba(255,130,130,.2);color:red}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project-list li a{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.empty-ticket,.home-project-list li a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project-list p{font-size:.75rem}.projects-empty p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.home-project-list h2,.home-project-list p{font-family:opensans-regular,Arial,Helvetica,sans-serif}.home-project-list li{border:1px solid #dedede;border-radius:3px;cursor:pointer;margin-bottom:.75rem;padding:1rem;text-overflow:ellipsis}.home-project-list li:hover{border-color:#9dce0a;-webkit-transition:all .3s linear;transition:all .3s linear}.home-project-list li:hover p{color:#555;-webkit-transition:color .3s linear;transition:color .3s linear}.home-project-list li:hover .private path{fill:#555;-webkit-transition:fill .3s linear;transition:fill .3s linear}.home-project-list li a{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:5rem}.home-project-list h2{color:#555;font-size:1.5rem;line-height:1.3;margin-bottom:.5rem;text-transform:none}.home-project-list h2 .project-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.home-project-list p{color:#b8b8b8;line-height:125%;margin:0}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar:after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-width:2rem}.navbar .nav-left>a path{fill:#fff}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a svg path{fill:#131a5c}.navbar a:hover{background:rgba(0,0,0,.2);color:#8c9eff}.navbar a:hover svg path{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-width:1.2rem}.navbar svg path{fill:#fff;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(33,33,33,0);border-bottom-color:#212121}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#bdbdbd;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#8c9eff}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(/images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#b8b8b8;display:inline-block;padding:1rem 1.25rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar h4{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar p{font-size:.9rem;color:#b8b8b8}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.master,body{background:#fff}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a,body{color:#424242}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}.menu-secondary{background:#fcfdff}.menu-tertiary{background-color:#1a237e}.extrabar{background:#fcfdff}h1,h2,h3,h4,h5,h6{color:#212121}a:hover{color:#3f51b5}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#3f51b5;color:#424242}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a4a4a4}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#a4a4a4}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#a4a4a4}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a4a4a4}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #f44336}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);color:#fff}blockquote{border-left:5px solid #8c9eff}blockquote,blockquote p,cite{color:#757575}.summary{background:#424242;color:#fff}.kanban-table-header .task-colum-name .icon,.taskboard-table-header .task-colum-name .icon{color:#3f51b5}.navbar{background:rgba(233,30,99,.6)}.navbar:after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#0d113f;background-image:none}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f2f4ff;border-top:3px solid #3f51b5}.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.kanban-table-header .task-colum-name{background:#f2f4ff;border-top:3px solid #3f51b5}.kanban-table-body .kanban-uses-box{background:#f5f5f5} \ No newline at end of file diff --git a/dist/styles/theme-taiga.css b/dist/styles/theme-taiga.css index 17264b1..261a84e 100644 --- a/dist/styles/theme-taiga.css +++ b/dist/styles/theme-taiga.css @@ -1,4 +1,4 @@ -@charset "UTF-8";.introjs-arrow,blockquote:after,blockquote:before,q:after,q:before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.invitation-main .avatar,.kanban,.login-main{-webkit-box-direction:normal}.kanban-task-minimized .task-name,.ticket-estimation .ticket-role-points .role,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.home-project-list p,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;line-height:18px;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! +@charset "UTF-8";.introjs-arrow,blockquote:after,blockquote:before,q:after,q:before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.kanban-task-minimized .task-name,.ticket-estimation .ticket-role-points .role,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.home-project-list p,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;line-height:18px;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! * Pikaday * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-family:opensans-regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:4;-webkit-flex:4;-ms-flex:4;flex:4;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}fieldset,p img{margin:0}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h2{font-size:2rem}h1,h1 span{font-size:3rem}h1,h2{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg dl dt,strong{font-weight:700}h1{margin-bottom:1rem;text-transform:uppercase}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#72a114}h1 .date{max-width:500px;color:#b8b8b8}h2{line-height:1.2;margin-bottom:1rem}p{line-height:1.5}em{font-style:italic}[class*=' icon-']:before,[class^=icon-]:before,[data-icon]:before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #050505;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]:before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug:before{content:'a'}.icon-copy:before{content:'b'}.icon-minimize:before{content:'c'}.icon-maximize:before{content:'d'}.icon-comment:before{content:'e'}.icon-plus:before{content:'f'}.icon-attachments:before{content:'g'}.icon-edit:before{content:'h'}.icon-documents:before{content:'i'}.icon-delete:before{content:'j'}.icon-arrow-bottom:before{content:'k'}.icon-arrow-left:before{content:'l'}.icon-arrow-right:before{content:'m'}.icon-arrow-up:before{content:'n'}.icon-briefcase:before{content:'o'}.icon-caret-down:before{content:'p'}.icon-caret-up:before{content:'q'}.icon-check-square:before{content:'r'}.icon-notification-error:before{content:'s'}.icon-settings:before{content:'t'}.icon-document:before{content:'u'}.icon-warning:before{content:'v'}.icon-move:before{content:'w'}.icon-drag-v:before{content:'x'}.icon-filter:before{content:'y'}.icon-help:before{content:'z'}.icon-reload:before{content:'A'}.icon-writer:before{content:'B'}.icon-stats:before{content:'C'}.icon-floppy:before{content:'D'}.icon-warning-alt:before{content:'E'}.icon-video:before{content:'F'}.icon-bulk:before{content:'G'}.icon-vunfold:before{content:'H'}.icon-tasks:before{content:'I'}.icon-kanban:before{content:'J'}.icon-search:before{content:'K'}.icon-wiki:before{content:'L'}.icon-team:before{content:'M'}.icon-vfold:before{content:'N'}.icon-issues:before{content:'O'}.icon-iocaine:before{content:'P'}.icon-archive:before{content:'Q'}.icon-capslock:before{content:'R'}.icon-upload:before{content:'S'}.icon-github:before{content:'T'}.icon-timeline:before{content:'U'}.icon-scrum:before{content:'V'}.icon-project:before{content:'W'}.icon-heart:before{content:'X'}.icon-eye:before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite:before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.blocked-warning .icon,.icon,.us-story-main-data .us-title.blocked{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}.pika-single{z-index:999999}.pika-single .pika-title{color:#444}.pika-single .is-selected .pika-button{background:#72a114;border-radius:0!important;box-shadow:inset 0 1px 3px #72a114}.pika-single .is-today .pika-button{color:#72a114}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#9dce0a!important;border-radius:0!important;box-shadow:inset 0 1px 3px #9dce0a!important}fieldset{border:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#555;display:none;position:absolute;right:1rem}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#b8b8b8}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.kanban,.taskboard{height:calc(100vh - 40px)}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.backlog-menu{background:#f5f5f5;color:#050505;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#050505;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#555;color:#f5f5f5}.backlog-menu .trans-button.active:hover{background:#a2a2a2}.backlog-menu .trans-button.move-to-current-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(/images/invitation_bg.jpg) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.blocked-warning .blocked,.login-main .logo,.login-main .tagline,.us-story-main-data .us-title .us-number{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#72a114}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#72a114}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main,.login-main{bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;-webkit-box-orient:horizontal;position:fixed;right:0;top:0;z-index:999;left:0}.login-main{background:url(/images/bg.png) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.login-main .tagline{font-size:2rem}.login-main fieldset{margin-bottom:.5rem}.login-main .logo,.login-main form{margin-bottom:1rem}.login-main .login-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.login-main .logo-svg{padding:0 33%;text-align:center;width:100%}.login-main .logo{font-size:3rem;color:#fff;text-align:center}.login-main .tagline{color:#fff;line-height:2rem;margin-bottom:1rem;text-align:center;text-transform:uppercase}.login-main .login-text,.login-main .register-text{text-align:center}.login-main .login-text a:hover,.login-main .register-text a:hover{color:#9dce0a}.login-main .button{color:#fff;display:block;text-align:center}.login-main a:hover{color:#fff}.error-main{background:url(/images/invitation_bg.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.taskboard-inner,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table,.taskboard-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#72a114}.error-main a:hover{color:#9dce0a}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#72a114}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a,.us-story-main-data .us-title .us-name,.us-story-main-data .us-title .us-number{font-size:2rem}.us-story-main-data .us-title{font-family:opensans-regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:2rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{background:#f5f5f5;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:red;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff8282}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff8282;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.basic-table,.us-story-main-data .us-title .us-title-text{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:9;-webkit-flex-grow:9;-ms-flex-positive:9;flex-grow:9}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:0;max-width:94%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#b8b8b8;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#444;display:inline-block;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#b8b8b8;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#b8b8b8;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #b8b8b8;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#72a114}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:red;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .block-description{color:#444;margin:0}.duty-content .edit-description,.wiki-content,.wysiwyg{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.duty-content{position:relative}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#444}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#b8b8b8}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#444}.duty-content .view-description .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wysiwyg textarea{background:#fff;max-height:none}.wiki .remove{font-size:.9rem;color:#b8b8b8}.wiki .remove:hover span{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:red;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#b8b8b8;margin-right:.2rem}.wiki-content{position:relative}.wiki-content.editable:hover .wysiwyg{background:#f5f5f5;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#444;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row,.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #ebebeb;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#050505;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#72a114}.trans-button:visited{color:#050505}.submit-button{width:100%}.button-green,a.button-green{background:#72a114}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#9dce0a;color:#fff}.button-gray,a.button-gray{background:#555}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#9dce0a;color:#fff}.button-blackish{background:#050505;color:#f5f5f5}.button-blackish:hover{background:#050505;color:#fff}.button-red{background:#ff8282}.button-red:hover{background:red;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:red}.button-block:hover{background:#ff8282;color:#fff}.button-bulk{background:#72a114;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-bulk:hover{background:#9dce0a}.button-auth{background:#444}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#f0f0f0;border:1px dashed #e1e1e1;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#e1e1e1;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#e1e1e1;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;margin:0}.check{background-color:#dcdcdc;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#555;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:opensans-regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#9dce0a;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.single-filter,.ticket-created-by .created-by .created-title.editable{cursor:pointer}.check input:disabled+div{background-color:#b8b8b8}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;margin-top:.5rem;position:relative}.ticket-created-by .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;line-height:1.5}.ticket-created-by .created-by .created-title{color:#72a114}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a,.ticket-estimation .ticket-role-points .role{font-size:.9rem}.ticket-estimation .ticket-role-points .points{font-size:1.6rem}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .points-per-role{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ticket-estimation .ticket-role-points{background:rgba(184,184,184,.1);border-radius:2px;color:rgba(68,68,68,.3);-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:.1rem;padding:.5rem 0 .1rem;position:relative;text-align:center;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.active{background:rgba(157,206,10,.9);color:#f5f5f5}.ticket-estimation .ticket-role-points:first-child{background:rgba(68,68,68,.25);border-radius:0;color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child{border:0}.ticket-estimation .ticket-role-points .points{font-family:opensans-regular,Arial,Helvetica,sans-serif;display:block;text-align:center}.ticket-estimation .ticket-role-points .role{max-width:90%;overflow:hidden;display:inline-block;text-align:center}.ticket-estimation .popover{background:#050505;color:#fff;display:none;left:35%;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#050505;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#9dce0a;color:#fff}.ticket-estimation .popover.fix{background:#050505;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#050505;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#444;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#dcdcdc;display:block;width:100%}.single-filter .number{background:#c2c2c2;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#444;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task .task-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.kanban-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#444}.kanban-task.blocked{background:red;border:1px solid #c00;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.kanban-task .kanban-tagline{border-color:#f1e8cd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #72a114;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#cfc29b;display:block}.kanban-task .task-num{color:#444;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#f1e8cd;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#e0cd91;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e8e8e8;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#e1e1e1;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#b8b8b8}.kanban-task-maximized .task-archived p{color:#b8b8b8;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#555;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#e0cd91;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e8e8e8;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#b8b8b8}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-itemtype-project .icon svg,.list-itemtype-ticket .icon svg,.list-itemtype-timeline .icon svg,.list-itemtype-user .icon svg,.loading-spinner{max-height:1rem;max-width:1rem}.kanban-task-minimized .task-archived p{color:#b8b8b8;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#b8b8b8;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-family:opensans-regular,Arial,Helvetica,sans-serif}.list-itemtype-project{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #f5f5f5;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#b8b8b8}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#b8b8b8;margin-right:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#b8b8b8;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-data .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#555;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#555;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#bbe831}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#237400}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e43050}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#810061}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#618000}.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}a.help-button,a.help-markdown{font-size:.9rem;color:#b8b8b8}a.help-button:hover span,a.help-markdown:hover span{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button:hover .icon,a.help-markdown:hover .icon{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button .icon,a.help-markdown .icon{color:#b8b8b8;margin-right:.2rem}.markItUpHeader ul{background:#f5f5f5;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#f5f5f5;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(157,206,10,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-light,.notification-message-error{-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%)}.notification-message-error{background:rgba(255,0,0,.9);top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(184,184,184,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(255,0,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#b8b8b8;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator a:hover{background:#050505;color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span{background:#9dce0a}.paginator .dots{background:0 0;color:#b8b8b8}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#555;color:#f5f5f5;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#050505;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#050505;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{height:.5rem;width:.5rem}.private path{fill:#b8b8b8;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color,.select-color a{font-size:.9rem}.select-color input{font-size:1rem}.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#b8b8b8;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background-color:#f5f5f5;width:243px}.select-color input::-webkit-input-placeholder{color:#555}.select-color input::-moz-placeholder{color:#555}.select-color input:-moz-placeholder{color:#555}.select-color input:-ms-input-placeholder{color:#555}.select-color .selected-color{background:#b8b8b8;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.empty-burndown,.empty-burndown .title,.summary .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#9dce0a}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#9dce0a;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats.active .graph{fill:#72a114}.summary .stats svg{height:100%;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#858585;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#444}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#9dce0a;height:24px}.summary-progress-bar .defined-points{background:#ff8282;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#9dce0a;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#72a114;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#9dce0a}.large-summary .icon.icon-stats.active:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(135,155,137,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#879b89;margin:0}.empty-burndown path{fill:#879b89}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#444;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-delete{color:#b8b8b8;margin-left:1rem}.tag .icon-delete:hover{color:red}.ui-autocomplete{background:#fff;border:1px solid #b8b8b8;z-index:99910}.ui-autocomplete .ui-state-focus{background:#9dce0a}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{padding:.4rem;width:14rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#b8b8b8}.tags-block .add-tag:hover{color:#9dce0a}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task .task-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.taskboard-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#444}.taskboard-task.blocked{background:red;border:1px solid #c00;color:#fff}.taskboard-task.blocked a,.taskboard-task.blocked span,.taskboard-task.blocked:hover .icon-drag-h,.taskboard-task.blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.taskboard-task .taskboard-tagline{border-color:#f1e8cd;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #72a114;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#cfc29b;display:block}.taskboard-task .task-assigned:hover{color:#72a114}.taskboard-task .task-num{color:#444;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#f1e8cd;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#cfc29b}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#f5f5f5;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e8e8e8;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#050505}.track-button.active .track-inner{background:rgba(157,206,10,.2)}.track-button.active .track-icon path{fill:#72a114}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#444}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff8282}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.admin-project-export-result .spin img,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(184,184,184,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#9dce0a}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#9dce0a}.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#b8b8b8;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#879b89;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a:hover path{fill:#879b89}.upvote-btn a.active{background:rgba(157,206,10,.2);color:#72a114;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.active path{fill:#72a114}.upvote-btn a.is-hover{background:red;color:#f5f5f5}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff8282}.upvote-btn svg{height:1rem;width:1rem}.upvote-btn span{display:block}.upvote-btn path{fill:#b8b8b8}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#444;margin-left:.5rem}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem .5rem .3rem;vertical-align:middle}.assigned-to-list .user-list-single:last-child,.ticket-watchers .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar,.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.assigned-to-list .user-list-single:hover{background:#f3fbe1;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#edfad4;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.3rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-name{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:red;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem;margin-bottom:.5rem}.wysiwyg h1{font-size:2rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#72a114}.wysiwyg a:hover{color:#9dce0a}.wysiwyg p{line-height:1.4rem;margin-bottom:1rem}.wysiwyg code,.wysiwyg pre{background:#5e5e5e;color:#f5f5f5;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #b8b8b8;margin-bottom:1rem}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#b8b8b8 1px solid}.wysiwyg th{border-right:#b8b8b8 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#b8b8b8 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#b8b8b8;margin-bottom:2rem}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .avatar .email{color:#b8b8b8}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete{font-size:1.2rem;color:#b8b8b8}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .privacy-settings label,.project-details input,.project-details label,.project-details textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.project-details form{max-width:700px;width:100%}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details textarea{height:10rem}.project-details .privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.project-details .privacy-settings>div{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;position:relative}.project-details .privacy-settings>div:first-child{margin-right:.5rem}.project-details .privacy-settings label{border:1px solid #b8b8b8;cursor:not-allowed;display:block;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-details .privacy-settings label span{color:#b8b8b8}.project-details .privacy-project{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.project-details .privacy-project:checked+label{background:#9dce0a;border:1px solid #9dce0a}.project-details .privacy-project:checked+label span{color:#fff}.project-details .button-green{color:#fff;display:block;text-align:center}.project-details .delete-project{font-size:.9rem;display:block;margin-top:1rem}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.backlog-table-body,.backlog-table-header,.kanban-table,.taskboard-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:opensans-regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprints-empty a,.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-header .task-colum-name,.taskboard-userstory-box .us-title{font-size:1.2rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.attachments-header,.ticket-assigned-to{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.taskboard-userstory-box .us-title{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:1rem;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.attachments,.duty-custom-fields{margin-bottom:2rem}.ticket-assigned-to .user-avatar{-webkit-flex-basis:4rem;-ms-flex-preferred-size:4rem;flex-basis:4rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block}.attachments-header .attachments-title,.colors-table .table-header,.single-attachment .attachment-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .user-assigned{font-size:1.2rem;color:#72a114;cursor:default;line-height:1.5rem}.ticket-assigned-to .assigned-to .user-assigned.editable{cursor:pointer}.ticket-assigned-to .assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assigned-to .assigned-name{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.add-attach span,.more-attachments,.single-attachment,.single-attachment .editable-attachment-comment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#444}.attachments-header .icon,.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings,.single-attachment .icon-delete{font-size:1.2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.attachments-header .attachments-num,.attachments-header .attachments-text{margin-right:.1rem}.attachments-header .icon{color:#444;cursor:pointer}.attachments-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem 1rem;position:relative}.category-config,.more-attachments{border-bottom:1px solid #b8b8b8}.single-attachment:hover .attachment-settings .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.single-attachment.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.deprecated,.single-attachment.deprecated .attachment-name a{color:#b8b8b8}.single-attachment.sortable-placeholder{background:#f5f5f5;height:40px}.single-attachment .attachment-name{max-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.5rem}.single-attachment .attachment-size{color:#b8b8b8;-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem}.single-attachment .attachment-comments,.single-attachment .editable-attachment-comment{-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-comments span,.single-attachment .editable-attachment-comment span{color:#555}.single-attachment .attachment-settings{-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings{color:#b8b8b8;display:block;position:absolute}.single-attachment .attachment-settings .editable-settings:hover,.single-attachment .attachment-settings .settings:hover{color:#72a114}.single-attachment .attachment-settings .settings{opacity:0;top:.5rem}.single-attachment .attachment-settings .editable-settings{opacity:1;top:1rem}.single-attachment .attachment-settings .icon-edit,.single-attachment .attachment-settings .icon-floppy{right:3.5rem}.single-attachment .attachment-settings .icon-delete{right:2rem}.single-attachment .attachment-settings .icon-delete:hover{color:red}.single-attachment .attachment-settings .icon-drag-v{cursor:move;right:0}.single-attachment .icon-delete{color:#b8b8b8}.single-attachment .icon-delete:hover{color:red}.single-attachment .editable-attachment-deprecated{padding-left:1rem}.single-attachment .editable-attachment-deprecated span{color:#b8b8b8}.single-attachment .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.single-attachment .editable-attachment-deprecated input:checked+span{color:#444}.single-attachment .percentage{background:rgba(114,161,20,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.more-attachments{display:block;padding:1rem 0 1rem 1rem}.more-attachments span{color:#b8b8b8}.more-attachments .more-attachments-num{color:#72a114;margin-left:.5rem}.more-attachments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.add-attach{cursor:pointer;overflow:hidden;position:relative}.add-attach input{display:none}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.add-attach span{color:#b8b8b8}.attachment-preview img{max-height:95vh;max-width:95vw}.category-config:first-child{border-top:1px solid #b8b8b8}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition .current-color{cursor:pointer}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields form label{cursor:pointer}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{color:#b8b8b8;padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;margin-bottom:.5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{margin-bottom:1rem;max-height:9rem;min-height:7rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-block textarea,.lightbox-create-issue textarea{min-height:8rem;max-height:12rem;margin-bottom:1rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list{right:.5rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row,.related-tasks-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:flex}.main-nav a,.main-nav span{display:block}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .ticket-role-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;max-width:calc(100% * (1/5) - .2rem)}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(5n+5){margin-right:0}.lb-create-edit-userstory .points-per-role{margin-bottom:1rem}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;min-height:calc(100vh - 40px);padding:1rem 0}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper:after{background:#050505;content:'';height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a,.related-tasks-header .icon{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.related-tasks-header .icon{color:#444;cursor:pointer}.related-tasks-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.filters-inner .loading .loading-spinner,.ticket-detail-settings .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg)}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data .ticket-data-container,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .status-data .pop-status,.ticket-status .status-data .pop-status a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-track-buttons .track-inner{font-size:.9rem}.ticket-data .ticket-title span:last-child,.ticket-track-buttons .track-button-counter{font-size:1.2rem}.ticket-data .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .status-data .pop-status,.ticket-status .type-data .pop-type,.ticket-track-buttons .track-inner{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-detail-settings .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.ticket-data .ticket-title{font-size:1.6rem;margin:1.5rem 0 2rem}.ticket-data .ticket-title span{margin-right:.25rem}.ticket-data .ticket-data-container{margin-bottom:1rem}.ticket-data .ticket-data-container .icon{margin-left:.25rem}.ticket-data .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-data .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-data .ticket-estimation .ticket-role-points{max-width:25%}.ticket-data .ticket-estimation .ticket-role-points:first-child{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.ticket-status{margin-bottom:.5rem}.ticket-status:last-child{margin:0}.ticket-status div{background:#e8e8e8;padding:.5rem 1rem .5rem .5rem;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{position:relative}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .severity-data{position:relative}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .priority-data .pop-priority:after,.ticket-status .status-data .pop-status:after{background:#050505;height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);content:''}.ticket-status .priority-data{position:relative}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{position:absolute;transform:rotate(45deg);width:0}.ticket-status .status-data{position:relative}.ticket-status .status-data .pop-status{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .status-data .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .status-data .pop-status a:last-child{border:0}.ticket-status .status-data .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .status-data .pop-status a:hover.point{color:#fff}.ticket-status .status-data .pop-status:after{position:absolute;transform:rotate(45deg);width:0}.ticket-track-buttons .track-inner{background:#e8e8e8;padding:.25rem;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-track-buttons .track-inner:hover{background:#dcdcdc}.ticket-track-buttons .track-button{width:100%}.ticket-track-buttons .active .track-button-counter{background:rgba(68,68,68,.5)}.ticket-track-buttons .active:hover .track-inner{background:rgba(157,206,10,.2)}.ticket-track-buttons .active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-track-buttons .active.is-hover path{fill:#ff8282}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.ticket-track-buttons .track-button-counter{background:rgba(68,68,68,.25);color:#f5f5f5;padding:0 .5rem}.ticket-track-buttons .vote-button{margin-bottom:.3rem}.ticket-track-buttons .watch-button{border-bottom:0}.ticket-track-buttons .ticket-watchers{margin:.5rem 0}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-track-buttons .add-watcher{display:block;margin:.5rem}.ticket-track-buttons .add-watcher .icon{background:rgba(68,68,68,.25);color:#f5f5f5;margin-right:.5rem;padding:.25rem}.ticket-track-buttons .add-watcher:hover .icon{background:#9dce0a;color:#f5f5f5;-webkit-transition:background .3s linear;transition:background .3s linear}.ticket-detail-settings{margin-top:2rem}.ticket-detail-settings .button,.ticket-detail-settings label{display:block;margin-bottom:.5rem;text-align:center}.ticket-detail-settings .button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .button-gray,.ticket-detail-settings .button-gray:hover{background:#b8b8b8}.ticket-detail-settings .button-gray.editable:hover{background:#444;cursor:pointer}.ticket-detail-settings .button-gray.active{background:#72a114}.ticket-detail-settings .item-block.editable:hover{background:red;cursor:pointer}.ticket-detail-settings .button-red{display:block;margin-top:2rem}.wizard-create-project{background:url(/images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(/images/bg.png) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#b8b8b8}.create-project input::-moz-placeholder{color:#b8b8b8}.create-project input:-moz-placeholder{color:#b8b8b8}.create-project input:-ms-input-placeholder{color:#b8b8b8}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#9dce0a}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-width:1rem}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{margin-bottom:2rem}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.single-project h1{color:#72a114;display:inline-block;line-height:1.2;margin-bottom:0;margin-right:3rem}.single-project .private{font-size:1rem;vertical-align:super}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#72a114}.single-project .track-container .icon svg{max-height:1rem;max-width:1rem}.single-project .project-data{display:flex}.single-project .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{margin-right:.14rem;width:24%}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1200px){.issues-table .created-field,.issues-table .level-field{display:none}}@media (max-width:767px){.issues-table .assigned-field,.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-body,.kanban-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-header .task-colum-name{font-size:1.2rem;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-inner,.search-filter ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:opensans-semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter a{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;opacity:.2}.search-filter ul{border-bottom:3px solid #b8b8b8;display:flex;padding-bottom:.5rem}.search-filter li{margin-right:1rem}.search-filter .active,.search-filter a:hover{color:#555;opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.search-filter .icon{margin-right:.4rem}.search-filter .name{padding-left:5px}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.search-result-table .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .position{color:#b8b8b8}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.user-change-password label,.user-profile label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile form .avatar-container p{font-size:.75rem}.user-profile .delete-account,.user-profile form .avatar-container .use-gravatar{font-size:.9rem}.user-profile form .avatar-container span{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.user-profile form .avatar-container .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem}.user-profile form{max-width:700px;width:100%}.user-profile form .container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile form .avatar-container{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:1rem}.user-profile form .avatar-container .image-container{position:relative}.user-profile form .avatar-container .avatar{border-radius:8%;width:100%}.user-profile form .avatar-container .overlay{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile form .avatar-container .loading-spinner{border:0;min-height:3rem;min-width:3rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.user-profile form .avatar-container p{line-height:.8rem;margin-bottom:.3rem;text-align:center}.user-profile form .avatar-container .use-gravatar{cursor:pointer;display:inline-block;text-align:center;width:100%}.user-profile form .data{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.user-profile fieldset{margin-bottom:1rem}.user-profile .submit{margin-top:2rem}.user-profile label{display:block;margin-bottom:.5rem}.user-profile textarea{min-height:7rem}.user-profile .button-green{color:#fff;cursor:pointer;display:block;padding:12px;text-align:center}.user-profile .delete-account{display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.wiki-nav li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center;width:100%}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single.blocked,.working-on .duty-single.blocked{background:rgba(255,130,130,.2);color:red}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project-list li a{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.empty-ticket,.home-project-list li a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project-list p{font-size:.75rem}.projects-empty p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.home-project-list h2,.home-project-list p{font-family:opensans-regular,Arial,Helvetica,sans-serif}.home-project-list li{border:1px solid #dedede;border-radius:3px;cursor:pointer;margin-bottom:.75rem;padding:1rem;text-overflow:ellipsis}.home-project-list li:hover{border-color:#9dce0a;-webkit-transition:all .3s linear;transition:all .3s linear}.home-project-list li:hover p{color:#555;-webkit-transition:color .3s linear;transition:color .3s linear}.home-project-list li:hover .private path{fill:#555;-webkit-transition:fill .3s linear;transition:fill .3s linear}.home-project-list li a{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:5rem}.home-project-list h2{color:#555;font-size:1.5rem;line-height:1.3;margin-bottom:.5rem;text-transform:none}.home-project-list h2 .project-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.home-project-list p{color:#b8b8b8;line-height:125%;margin:0}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar:after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-width:2rem}.navbar .nav-left>a path{fill:#fff}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a svg path{fill:#718874}.navbar a:hover{background:rgba(0,0,0,.2);color:#9dce0a}.navbar a:hover svg path{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-width:1.2rem}.navbar svg path{fill:#11241f;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#050505;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(5,5,5,0);border-bottom-color:#050505}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#b8b8b8;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#9dce0a}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(/images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#b8b8b8;display:inline-block;padding:1rem 1.25rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar h4{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar p{font-size:.9rem;color:#b8b8b8}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.master,body{background:#fff}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a,body{color:#444}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}.menu-secondary{background:#f5f5f5}.menu-tertiary{background-color:#879b89}.extrabar{background:#f5f5f5}h1,h2,h3,h4,h5,h6{color:#050505}a:hover{color:#72a114}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#b8b8b8;color:#444}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#9f9f9f}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#9f9f9f}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#9f9f9f}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9f9f9f}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid red}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);color:#fff}blockquote{border-left:5px solid #f5f5f5}blockquote,blockquote p,cite{color:#555}.summary{background:#444;color:#fff}.kanban-table-header .task-colum-name .icon,.taskboard-table-header .task-colum-name .icon{color:#b8b8b8}.navbar{background:rgba(0,0,0,.5)}.navbar:after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#879b89;background-image:url(../images/menu.png)}.kanban-table-body .kanban-uses-box,.kanban-table-header .task-colum-name,.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #b8b8b8}.kanban-table-header .task-colum-name{border-top:3px solid #b8b8b8} \ No newline at end of file + */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-family:opensans-regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:4;-webkit-flex:4;-ms-flex:4;flex:4;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}fieldset,p img{margin:0}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h2{font-size:2rem}h1,h1 span{font-size:3rem}h1,h2{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg dl dt,strong{font-weight:700}h1{margin-bottom:1rem;text-transform:uppercase}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#72a114}h1 .date{max-width:500px;color:#b8b8b8}h2{line-height:1.2;margin-bottom:1rem}p{line-height:1.5}em{font-style:italic}[class*=' icon-']:before,[class^=icon-]:before,[data-icon]:before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #050505;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]:before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug:before{content:'a'}.icon-copy:before{content:'b'}.icon-minimize:before{content:'c'}.icon-maximize:before{content:'d'}.icon-comment:before{content:'e'}.icon-plus:before{content:'f'}.icon-attachments:before{content:'g'}.icon-edit:before{content:'h'}.icon-documents:before{content:'i'}.icon-delete:before{content:'j'}.icon-arrow-bottom:before{content:'k'}.icon-arrow-left:before{content:'l'}.icon-arrow-right:before{content:'m'}.icon-arrow-up:before{content:'n'}.icon-briefcase:before{content:'o'}.icon-caret-down:before{content:'p'}.icon-caret-up:before{content:'q'}.icon-check-square:before{content:'r'}.icon-notification-error:before{content:'s'}.icon-settings:before{content:'t'}.icon-document:before{content:'u'}.icon-warning:before{content:'v'}.icon-move:before{content:'w'}.icon-drag-v:before{content:'x'}.icon-filter:before{content:'y'}.icon-help:before{content:'z'}.icon-reload:before{content:'A'}.icon-writer:before{content:'B'}.icon-stats:before{content:'C'}.icon-floppy:before{content:'D'}.icon-warning-alt:before{content:'E'}.icon-video:before{content:'F'}.icon-bulk:before{content:'G'}.icon-vunfold:before{content:'H'}.icon-tasks:before{content:'I'}.icon-kanban:before{content:'J'}.icon-search:before{content:'K'}.icon-wiki:before{content:'L'}.icon-team:before{content:'M'}.icon-vfold:before{content:'N'}.icon-issues:before{content:'O'}.icon-iocaine:before{content:'P'}.icon-archive:before{content:'Q'}.icon-capslock:before{content:'R'}.icon-upload:before{content:'S'}.icon-github:before{content:'T'}.icon-timeline:before{content:'U'}.icon-scrum:before{content:'V'}.icon-project:before{content:'W'}.icon-heart:before{content:'X'}.icon-eye:before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite:before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.blocked-warning .icon,.icon,.us-story-main-data .us-title.blocked{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}.pika-single{z-index:999999}.pika-single .pika-title{color:#444}.pika-single .is-selected .pika-button{background:#72a114;border-radius:0!important;box-shadow:inset 0 1px 3px #72a114}.pika-single .is-today .pika-button{color:#72a114}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#9dce0a!important;border-radius:0!important;box-shadow:inset 0 1px 3px #9dce0a!important}fieldset{border:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#555;display:none;position:absolute;right:1rem}.auth,.error-main{bottom:0;z-index:999;left:0}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#b8b8b8}.auth .logo,.auth .tagline{color:#fff;text-align:center}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.kanban,.taskboard{height:calc(100vh - 40px)}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(/images/bg.png) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth .logo{font-size:3rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.auth .auth-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{padding:0 33%;text-align:center;width:100%}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{text-align:center}.auth .login-text a:hover,.auth .register-text a:hover{color:#9dce0a}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moustache;animation-name:moustache;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;fill:rgba(114,161,20,.9);stroke:#9dce0a;stroke-width:1px;-webkit-transform-origin:50% 20%;-ms-transform-origin:50% 20%;transform-origin:50% 20%;-webkit-transition:.3s;transition:.3s}.moustache:hover{fill:rgba(157,206,10,.9);-webkit-transition:.3s;transition:.3s}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}@-webkit-keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}.backlog-menu{background:#f5f5f5;color:#050505;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#050505;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#555;color:#f5f5f5}.backlog-menu .trans-button.active:hover{background:#a2a2a2}.backlog-menu .trans-button.move-to-current-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(/images/invitation_bg.jpg) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#72a114}.invitation-main .button-auth{display:block}.error-main,.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.invitation-main .button-blackish:hover{background:#72a114}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main{background:url(/images/invitation_bg.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.taskboard-inner,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table,.taskboard-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#72a114}.error-main a:hover{color:#9dce0a}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#72a114}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a,.us-story-main-data .us-title .us-name,.us-story-main-data .us-title .us-number{font-size:2rem}.blocked-warning .blocked,.us-story-main-data .us-title .us-number{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.us-story-main-data .us-title{font-family:opensans-regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:2rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{background:#f5f5f5;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:red;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff8282}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff8282;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.basic-table,.us-story-main-data .us-title .us-title-text{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:9;-webkit-flex-grow:9;-ms-flex-positive:9;flex-grow:9}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:0;max-width:94%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#b8b8b8;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#444;display:inline-block;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#b8b8b8;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#b8b8b8;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #b8b8b8;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#72a114}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:red;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .block-description{color:#444;margin:0}.duty-content .edit-description,.wiki-content,.wysiwyg{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.duty-content{position:relative}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#444}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#b8b8b8}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#444}.duty-content .view-description .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wysiwyg textarea{background:#fff;max-height:none}.wiki .remove{font-size:.9rem;color:#b8b8b8}.wiki .remove:hover span{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:red;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#b8b8b8;margin-right:.2rem}.wiki-content{position:relative}.wiki-content.editable:hover .wysiwyg{background:#f5f5f5;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#444;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row,.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #ebebeb;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#050505;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#72a114}.trans-button:visited{color:#050505}.submit-button{width:100%}.button-green,a.button-green{background:#72a114}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#9dce0a;color:#fff}.button-gray,a.button-gray{background:#555}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#9dce0a;color:#fff}.button-blackish{background:#050505;color:#f5f5f5}.button-blackish:hover{background:#050505;color:#fff}.button-red{background:#ff8282}.button-red:hover{background:red;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:red}.button-block:hover{background:#ff8282;color:#fff}.button-bulk{background:#72a114;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-bulk:hover{background:#9dce0a}.button-auth{background:#444}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#f0f0f0;border:1px dashed #e1e1e1;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#e1e1e1;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#e1e1e1;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;margin:0}.check{background-color:#dcdcdc;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#555;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:opensans-regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#9dce0a;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.single-filter,.ticket-created-by .created-by .created-title.editable{cursor:pointer}.check input:disabled+div{background-color:#b8b8b8}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;margin-top:.5rem;position:relative}.ticket-created-by .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;line-height:1.5}.ticket-created-by .created-by .created-title{color:#72a114}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a,.ticket-estimation .ticket-role-points .role{font-size:.9rem}.ticket-estimation .ticket-role-points .points{font-size:1.6rem}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .points-per-role{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ticket-estimation .ticket-role-points{background:rgba(184,184,184,.1);border-radius:2px;color:rgba(68,68,68,.3);-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:.1rem;padding:.5rem 0 .1rem;position:relative;text-align:center;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.active{background:rgba(157,206,10,.9);color:#f5f5f5}.ticket-estimation .ticket-role-points:first-child{background:rgba(68,68,68,.25);border-radius:0;color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child{border:0}.ticket-estimation .ticket-role-points .points{font-family:opensans-regular,Arial,Helvetica,sans-serif;display:block;text-align:center}.ticket-estimation .ticket-role-points .role{max-width:90%;overflow:hidden;display:inline-block;text-align:center}.ticket-estimation .popover{background:#050505;color:#fff;display:none;left:35%;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#050505;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#9dce0a;color:#fff}.ticket-estimation .popover.fix{background:#050505;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:105%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#050505;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#444;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#dcdcdc;display:block;width:100%}.single-filter .number{background:#c2c2c2;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#444;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task .task-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.kanban-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#444}.kanban-task.blocked{background:red;border:1px solid #c00;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.kanban-task .kanban-tagline{border-color:#f1e8cd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #72a114;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#cfc29b;display:block}.kanban-task .task-num{color:#444;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#f1e8cd;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#e0cd91;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e8e8e8;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#e1e1e1;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#b8b8b8}.kanban-task-maximized .task-archived p{color:#b8b8b8;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#555;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#e0cd91;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e8e8e8;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#b8b8b8}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-itemtype-project .icon svg,.list-itemtype-ticket .icon svg,.list-itemtype-timeline .icon svg,.list-itemtype-user .icon svg,.loading-spinner{max-height:1rem;max-width:1rem}.kanban-task-minimized .task-archived p{color:#b8b8b8;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#b8b8b8;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-family:opensans-regular,Arial,Helvetica,sans-serif}.list-itemtype-project{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #f5f5f5;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#b8b8b8}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#b8b8b8;margin-right:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#b8b8b8;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-data .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#555;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#555;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#bbe831}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#237400}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e43050}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#810061}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#618000}.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}a.help-button,a.help-markdown{font-size:.9rem;color:#b8b8b8}a.help-button:hover span,a.help-markdown:hover span{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button:hover .icon,a.help-markdown:hover .icon{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}a.help-button .icon,a.help-markdown .icon{color:#b8b8b8;margin-right:.2rem}.markItUpHeader ul{background:#f5f5f5;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#f5f5f5;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(157,206,10,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-light,.notification-message-error{-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%)}.notification-message-error{background:rgba(255,0,0,.9);top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(184,184,184,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(255,0,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#b8b8b8;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator a:hover{background:#050505;color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span{background:#9dce0a}.paginator .dots{background:0 0;color:#b8b8b8}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#555;color:#f5f5f5;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#050505;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#050505;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{height:.5rem;width:.5rem}.private path{fill:#b8b8b8;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color,.select-color a{font-size:.9rem}.select-color input{font-size:1rem}.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#b8b8b8;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background-color:#f5f5f5;width:243px}.select-color input::-webkit-input-placeholder{color:#555}.select-color input::-moz-placeholder{color:#555}.select-color input:-moz-placeholder{color:#555}.select-color input:-ms-input-placeholder{color:#555}.select-color .selected-color{background:#b8b8b8;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.empty-burndown,.empty-burndown .title,.summary .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#9dce0a}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#9dce0a;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats.active .graph{fill:#72a114}.summary .stats svg{height:100%;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#858585;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#444}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#9dce0a;height:24px}.summary-progress-bar .defined-points{background:#ff8282;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#9dce0a;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#72a114;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#9dce0a}.large-summary .icon.icon-stats.active:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(135,155,137,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#879b89;margin:0}.empty-burndown path{fill:#879b89}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#444;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-delete{color:#b8b8b8;margin-left:1rem}.tag .icon-delete:hover{color:red}.ui-autocomplete{background:#fff;border:1px solid #b8b8b8;z-index:99910}.ui-autocomplete .ui-state-focus{background:#9dce0a}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{padding:.4rem;width:14rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#b8b8b8}.tags-block .add-tag:hover{color:#9dce0a}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task .task-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.taskboard-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#444}.taskboard-task.blocked{background:red;border:1px solid #c00;color:#fff}.taskboard-task.blocked a,.taskboard-task.blocked span,.taskboard-task.blocked:hover .icon-drag-h,.taskboard-task.blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.taskboard-task .taskboard-tagline{border-color:#f1e8cd;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #72a114;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#cfc29b;display:block}.taskboard-task .task-assigned:hover{color:#72a114}.taskboard-task .task-num{color:#444;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#f1e8cd;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#cfc29b}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#f5f5f5;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e8e8e8;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#050505}.track-button.active .track-inner{background:rgba(157,206,10,.2)}.track-button.active .track-icon path{fill:#72a114}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#444}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff8282}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.admin-project-export-result .spin img,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(184,184,184,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#9dce0a}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#9dce0a}.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#b8b8b8;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#879b89;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a:hover path{fill:#879b89}.upvote-btn a.active{background:rgba(157,206,10,.2);color:#72a114;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.active path{fill:#72a114}.upvote-btn a.is-hover{background:red;color:#f5f5f5}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff8282}.upvote-btn svg{height:1rem;width:1rem}.upvote-btn span{display:block}.upvote-btn path{fill:#b8b8b8}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#444;margin-left:.5rem}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem .5rem .3rem;vertical-align:middle}.assigned-to-list .user-list-single:last-child,.ticket-watchers .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar,.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.assigned-to-list .user-list-single:hover{background:#f3fbe1;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#edfad4;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.3rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-name{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:red;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem;margin-bottom:.5rem}.wysiwyg h1{font-size:2rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#72a114}.wysiwyg a:hover{color:#9dce0a}.wysiwyg p{line-height:1.4rem;margin-bottom:1rem}.wysiwyg code,.wysiwyg pre{background:#5e5e5e;color:#f5f5f5;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #b8b8b8;margin-bottom:1rem}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#b8b8b8 1px solid}.wysiwyg th{border-right:#b8b8b8 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#b8b8b8 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#b8b8b8;margin-bottom:2rem}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .avatar .email{color:#b8b8b8}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete{font-size:1.2rem;color:#b8b8b8}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .privacy-settings label,.project-details input,.project-details label,.project-details textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.project-details form{max-width:700px;width:100%}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details textarea{height:10rem}.project-details .privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.project-details .privacy-settings>div{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;position:relative}.project-details .privacy-settings>div:first-child{margin-right:.5rem}.project-details .privacy-settings label{border:1px solid #b8b8b8;cursor:not-allowed;display:block;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-details .privacy-settings label span{color:#b8b8b8}.project-details .privacy-project{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.project-details .privacy-project:checked+label{background:#9dce0a;border:1px solid #9dce0a}.project-details .privacy-project:checked+label span{color:#fff}.project-details .button-green{color:#fff;display:block;text-align:center}.project-details .delete-project{font-size:.9rem;display:block;margin-top:1rem}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.backlog-table-body,.backlog-table-header,.kanban-table,.taskboard-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:opensans-regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprints-empty a,.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-header .task-colum-name,.taskboard-userstory-box .us-title{font-size:1.2rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.attachments-header,.ticket-assigned-to{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.taskboard-userstory-box .us-title{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;margin-bottom:1rem;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.attachments,.duty-custom-fields{margin-bottom:2rem}.ticket-assigned-to .user-avatar{-webkit-flex-basis:4rem;-ms-flex-preferred-size:4rem;flex-basis:4rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block}.attachments-header .attachments-title,.colors-table .table-header,.single-attachment .attachment-name{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .user-assigned{font-size:1.2rem;color:#72a114;cursor:default;line-height:1.5rem}.ticket-assigned-to .assigned-to .user-assigned.editable{cursor:pointer}.ticket-assigned-to .assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assigned-to .assigned-name{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.add-attach span,.more-attachments,.single-attachment,.single-attachment .editable-attachment-comment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#444}.attachments-header .icon,.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings,.single-attachment .icon-delete{font-size:1.2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.attachments-header .attachments-num,.attachments-header .attachments-text{margin-right:.1rem}.attachments-header .icon{color:#444;cursor:pointer}.attachments-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem 1rem;position:relative}.category-config,.more-attachments{border-bottom:1px solid #b8b8b8}.single-attachment:hover .attachment-settings .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.single-attachment.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.deprecated,.single-attachment.deprecated .attachment-name a{color:#b8b8b8}.single-attachment.sortable-placeholder{background:#f5f5f5;height:40px}.single-attachment .attachment-name{max-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.5rem}.single-attachment .attachment-size{color:#b8b8b8;-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem}.single-attachment .attachment-comments,.single-attachment .editable-attachment-comment{-webkit-flex-basis:35%;-ms-flex-preferred-size:35%;flex-basis:35%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-comments span,.single-attachment .editable-attachment-comment span{color:#555}.single-attachment .attachment-settings{-webkit-flex-basis:15%;-ms-flex-preferred-size:15%;flex-basis:15%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.single-attachment .attachment-settings .editable-settings,.single-attachment .attachment-settings .settings{color:#b8b8b8;display:block;position:absolute}.single-attachment .attachment-settings .editable-settings:hover,.single-attachment .attachment-settings .settings:hover{color:#72a114}.single-attachment .attachment-settings .settings{opacity:0;top:.5rem}.single-attachment .attachment-settings .editable-settings{opacity:1;top:1rem}.single-attachment .attachment-settings .icon-edit,.single-attachment .attachment-settings .icon-floppy{right:3.5rem}.single-attachment .attachment-settings .icon-delete{right:2rem}.single-attachment .attachment-settings .icon-delete:hover{color:red}.single-attachment .attachment-settings .icon-drag-v{cursor:move;right:0}.single-attachment .icon-delete{color:#b8b8b8}.single-attachment .icon-delete:hover{color:red}.single-attachment .editable-attachment-deprecated{padding-left:1rem}.single-attachment .editable-attachment-deprecated span{color:#b8b8b8}.single-attachment .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.single-attachment .editable-attachment-deprecated input:checked+span{color:#444}.single-attachment .percentage{background:rgba(114,161,20,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.more-attachments{display:block;padding:1rem 0 1rem 1rem}.more-attachments span{color:#b8b8b8}.more-attachments .more-attachments-num{color:#72a114;margin-left:.5rem}.more-attachments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.add-attach{cursor:pointer;overflow:hidden;position:relative}.add-attach input{display:none}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.add-attach span{color:#b8b8b8}.attachment-preview img{max-height:95vh;max-width:95vw}.category-config:first-child{border-top:1px solid #b8b8b8}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition .current-color{cursor:pointer}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields form label{cursor:pointer}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{color:#b8b8b8;padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;margin-bottom:.5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:opensans-regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{margin-bottom:1rem;max-height:9rem;min-height:7rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-block textarea,.lightbox-create-issue textarea{min-height:8rem;max-height:12rem;margin-bottom:1rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list{right:.5rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row,.related-tasks-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:flex}.main-nav a,.main-nav span{display:block}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .ticket-role-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;max-width:calc(100% * (1/5) - .2rem)}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(5n+5){margin-right:0}.lb-create-edit-userstory .points-per-role{margin-bottom:1rem}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;min-height:calc(100vh - 40px);padding:1rem 0}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper:after{background:#050505;content:'';height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a,.related-tasks-header .icon{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.related-tasks-header .icon{color:#444;cursor:pointer}.related-tasks-header .icon:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.filters-inner .loading .loading-spinner,.ticket-detail-settings .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg)}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data .ticket-data-container,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .status-data .pop-status,.ticket-status .status-data .pop-status a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-track-buttons .track-inner{font-size:.9rem}.ticket-data .ticket-title span:last-child,.ticket-track-buttons .track-button-counter{font-size:1.2rem}.ticket-data .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .status-data .pop-status,.ticket-status .type-data .pop-type,.ticket-track-buttons .track-inner{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-detail-settings .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-width:1rem;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.ticket-data .ticket-title{font-size:1.6rem;margin:1.5rem 0 2rem}.ticket-data .ticket-title span{margin-right:.25rem}.ticket-data .ticket-data-container{margin-bottom:1rem}.ticket-data .ticket-data-container .icon{margin-left:.25rem}.ticket-data .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-data .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-data .ticket-estimation .ticket-role-points{max-width:25%}.ticket-data .ticket-estimation .ticket-role-points:first-child{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.ticket-status{margin-bottom:.5rem}.ticket-status:last-child{margin:0}.ticket-status div{background:#e8e8e8;padding:.5rem 1rem .5rem .5rem;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{position:relative}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .severity-data{position:relative}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;transform:rotate(45deg);width:0}.ticket-status .priority-data .pop-priority:after,.ticket-status .status-data .pop-status:after{background:#050505;height:15px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);content:''}.ticket-status .priority-data{position:relative}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{position:absolute;transform:rotate(45deg);width:0}.ticket-status .status-data{position:relative}.ticket-status .status-data .pop-status{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .status-data .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .status-data .pop-status a:last-child{border:0}.ticket-status .status-data .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .status-data .pop-status a:hover.point{color:#fff}.ticket-status .status-data .pop-status:after{position:absolute;transform:rotate(45deg);width:0}.ticket-track-buttons .track-inner{background:#e8e8e8;padding:.25rem;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-track-buttons .track-inner:hover{background:#dcdcdc}.ticket-track-buttons .track-button{width:100%}.ticket-track-buttons .active .track-button-counter{background:rgba(68,68,68,.5)}.ticket-track-buttons .active:hover .track-inner{background:rgba(157,206,10,.2)}.ticket-track-buttons .active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-track-buttons .active.is-hover path{fill:#ff8282}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.ticket-track-buttons .track-button-counter{background:rgba(68,68,68,.25);color:#f5f5f5;padding:0 .5rem}.ticket-track-buttons .vote-button{margin-bottom:.3rem}.ticket-track-buttons .watch-button{border-bottom:0}.ticket-track-buttons .ticket-watchers{margin:.5rem 0}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-track-buttons .add-watcher{display:block;margin:.5rem}.ticket-track-buttons .add-watcher .icon{background:rgba(68,68,68,.25);color:#f5f5f5;margin-right:.5rem;padding:.25rem}.ticket-track-buttons .add-watcher:hover .icon{background:#9dce0a;color:#f5f5f5;-webkit-transition:background .3s linear;transition:background .3s linear}.ticket-detail-settings{margin-top:2rem}.ticket-detail-settings .button,.ticket-detail-settings label{display:block;margin-bottom:.5rem;text-align:center}.ticket-detail-settings .button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .button-gray,.ticket-detail-settings .button-gray:hover{background:#b8b8b8}.ticket-detail-settings .button-gray.editable:hover{background:#444;cursor:pointer}.ticket-detail-settings .button-gray.active{background:#72a114}.ticket-detail-settings .item-block.editable:hover{background:red;cursor:pointer}.ticket-detail-settings .button-red{display:block;margin-top:2rem}.wizard-create-project{background:url(/images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(/images/bg.png) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#b8b8b8}.create-project input::-moz-placeholder{color:#b8b8b8}.create-project input:-moz-placeholder{color:#b8b8b8}.create-project input:-ms-input-placeholder{color:#b8b8b8}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#9dce0a}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-width:1rem}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{margin-bottom:2rem}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.single-project h1{color:#72a114;display:inline-block;line-height:1.2;margin-bottom:0;margin-right:3rem}.single-project .private{font-size:1rem;vertical-align:super}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#72a114}.single-project .track-container .icon svg{max-height:1rem;max-width:1rem}.single-project .project-data{display:flex}.single-project .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{margin-right:.14rem;width:24%}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:opensans-semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1200px){.issues-table .created-field,.issues-table .level-field{display:none}}@media (max-width:767px){.issues-table .assigned-field,.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-body,.kanban-table-header .task-colum-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-header .task-colum-name{font-size:1.2rem;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-inner,.search-filter ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:opensans-semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter a{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;opacity:.2}.search-filter ul{border-bottom:3px solid #b8b8b8;display:flex;padding-bottom:.5rem}.search-filter li{margin-right:1rem}.search-filter .active,.search-filter a:hover{color:#555;opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.search-filter .icon{margin-right:.4rem}.search-filter .name{padding-left:5px}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.search-result-table .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .position{color:#b8b8b8}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.user-change-password label,.user-profile label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile form .avatar-container p{font-size:.75rem}.user-profile .delete-account,.user-profile form .avatar-container .use-gravatar{font-size:.9rem}.user-profile form .avatar-container span{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.user-profile form .avatar-container .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem}.user-profile form{max-width:700px;width:100%}.user-profile form .container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile form .avatar-container{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:1rem}.user-profile form .avatar-container .image-container{position:relative}.user-profile form .avatar-container .avatar{border-radius:8%;width:100%}.user-profile form .avatar-container .overlay{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile form .avatar-container .loading-spinner{border:0;min-height:3rem;min-width:3rem;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.user-profile form .avatar-container p{line-height:.8rem;margin-bottom:.3rem;text-align:center}.user-profile form .avatar-container .use-gravatar{cursor:pointer;display:inline-block;text-align:center;width:100%}.user-profile form .data{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.user-profile fieldset{margin-bottom:1rem}.user-profile .submit{margin-top:2rem}.user-profile label{display:block;margin-bottom:.5rem}.user-profile textarea{min-height:7rem}.user-profile .button-green{color:#fff;cursor:pointer;display:block;padding:12px;text-align:center}.user-profile .delete-account{display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.wiki-nav li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:opensans-regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center;width:100%}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single.blocked,.working-on .duty-single.blocked{background:rgba(255,130,130,.2);color:red}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project-list li a{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.empty-ticket,.home-project-list li a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project-list p{font-size:.75rem}.projects-empty p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.home-project-list h2,.home-project-list p{font-family:opensans-regular,Arial,Helvetica,sans-serif}.home-project-list li{border:1px solid #dedede;border-radius:3px;cursor:pointer;margin-bottom:.75rem;padding:1rem;text-overflow:ellipsis}.home-project-list li:hover{border-color:#9dce0a;-webkit-transition:all .3s linear;transition:all .3s linear}.home-project-list li:hover p{color:#555;-webkit-transition:color .3s linear;transition:color .3s linear}.home-project-list li:hover .private path{fill:#555;-webkit-transition:fill .3s linear;transition:fill .3s linear}.home-project-list li a{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:5rem}.home-project-list h2{color:#555;font-size:1.5rem;line-height:1.3;margin-bottom:.5rem;text-transform:none}.home-project-list h2 .project-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.home-project-list p{color:#b8b8b8;line-height:125%;margin:0}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar:after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-width:2rem}.navbar .nav-left>a path{fill:#fff}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a svg path{fill:#718874}.navbar a:hover{background:rgba(0,0,0,.2);color:#9dce0a}.navbar a:hover svg path{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-width:1.2rem}.navbar svg path{fill:#11241f;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#050505;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(5,5,5,0);border-bottom-color:#050505}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#b8b8b8;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#9dce0a}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(/images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#b8b8b8;display:inline-block;padding:1rem 1.25rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar h4{font-family:opensans-semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar p{font-size:.9rem;color:#b8b8b8}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.master,body{background:#fff}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:opensans-regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:opensans-semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;-ms-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a,body{color:#444}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}.menu-secondary{background:#f5f5f5}.menu-tertiary{background-color:#879b89}.extrabar{background:#f5f5f5}h1,h2,h3,h4,h5,h6{color:#050505}a:hover{color:#72a114}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#b8b8b8;color:#444}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#9f9f9f}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#9f9f9f}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#9f9f9f}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9f9f9f}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid red}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);color:#fff}blockquote{border-left:5px solid #f5f5f5}blockquote,blockquote p,cite{color:#555}.summary{background:#444;color:#fff}.kanban-table-header .task-colum-name .icon,.taskboard-table-header .task-colum-name .icon{color:#b8b8b8}.navbar{background:rgba(0,0,0,.5)}.navbar:after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#879b89;background-image:url(../images/menu.png)}.kanban-table-body .kanban-uses-box,.kanban-table-header .task-colum-name,.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #b8b8b8}.kanban-table-header .task-colum-name{border-top:3px solid #b8b8b8} \ No newline at end of file diff --git a/dist/svg/logo-moustache.svg b/dist/svg/logo-moustache.svg new file mode 100644 index 0000000..6750579 --- /dev/null +++ b/dist/svg/logo-moustache.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/generate.sh b/generate.sh new file mode 100755 index 0000000..e4bea3b --- /dev/null +++ b/generate.sh @@ -0,0 +1,2 @@ +git checkout stable; node dist.js stable +