From d2268e85433d513737055ea87e774a2bd268cb1d Mon Sep 17 00:00:00 2001 From: m Date: Sun, 1 Apr 2018 17:40:45 +0200 Subject: [PATCH 01/19] =?UTF-8?q?Donner=20le=20lien=20d'=C3=A9dition=20d'u?= =?UTF-8?q?n=20vote=20lorsqu'on=20est=20administrateur=20https://framagit.?= =?UTF-8?q?org/framasoft/framadate/issues/209?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locale/en.json | 3 ++- tpl/part/vote_table_classic.tpl | 5 +++++ tpl/part/vote_table_date.tpl | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/locale/en.json b/locale/en.json index f6c41e4..a0a3519 100644 --- a/locale/en.json +++ b/locale/en.json @@ -283,7 +283,8 @@ "Vote yes for": "Vote \"yes\" for", "Votes of the poll": "Votes", "polled user": "polled user", - "polled users": "polled users" + "polled users": "polled users", + "Link to edit this particular line" : "Link to edit this particular line" }, "PollInfo": { "Admin link of the poll": "Admin link for the poll", diff --git a/tpl/part/vote_table_classic.tpl b/tpl/part/vote_table_classic.tpl index 9b18189..1b57894 100644 --- a/tpl/part/vote_table_classic.tpl +++ b/tpl/part/vote_table_classic.tpl @@ -151,6 +151,11 @@ title="{__('Poll results', 'Remove the line:')} {$vote->name|html}"> {__('Generic', 'Remove')} + + + {__('Poll results', 'Link to edit this particular line')} + + {/if} {else} diff --git a/tpl/part/vote_table_date.tpl b/tpl/part/vote_table_date.tpl index 0fa5804..db8cdce 100644 --- a/tpl/part/vote_table_date.tpl +++ b/tpl/part/vote_table_date.tpl @@ -209,6 +209,11 @@ title="{__('Poll results', 'Remove the line:')} {$vote->name|html}"> {__('Generic', 'Remove')} + + + {__('Poll results', 'Link to edit this particular line')} + + {/if} {else} From cdd1840217cb4fdff70b376eecd1a6b3b429fb28 Mon Sep 17 00:00:00 2001 From: m Date: Sun, 1 Apr 2018 19:29:32 +0200 Subject: [PATCH 02/19] =?UTF-8?q?correction=20:=20filtre=20adresse=20e-mai?= =?UTF-8?q?l=20avec=20nom=20de=20domaine=20internationalis=C3=A9=20https:/?= =?UTF-8?q?/framagit.org/framasoft/framadate/issues/233?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Framadate/Services/InputService.php | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/app/classes/Framadate/Services/InputService.php b/app/classes/Framadate/Services/InputService.php index 2c5e1da..32283b1 100644 --- a/app/classes/Framadate/Services/InputService.php +++ b/app/classes/Framadate/Services/InputService.php @@ -65,7 +65,45 @@ class InputService { } public function filterMail($mail) { - return filter_var($mail, FILTER_VALIDATE_EMAIL); + + $mail = mb_strtolower(trim($mail)); + + + $decoupage = explode("@", $mail, 2); + + $resultat = FALSE; + + + if (isset($decoupage[1])) { + + $domaine = idn_to_ascii( + $decoupage[1] + , IDNA_DEFAULT + , INTL_IDNA_VARIANT_UTS46 + ); + + $adresseConvertie = "{$decoupage[0]}@$domaine"; + + $adresseFiltree = filter_var( + $adresseConvertie + , FILTER_VALIDATE_EMAIL + , ["flags" => FILTER_FLAG_EMAIL_UNICODE] // permet d'utiliser des accents avant le @ + ); + + if ($adresseConvertie === $adresseFiltree) { + + $testMX = getmxrr($domaine, $_); // tester sur le domaine indique un serveur MX + + if ($testMX) { + $resultat = $mail; + } + + } + + } + + + return $resultat; } public function filterDescription($description) { From 37c2df781a6126d0644d21768afb651c469e3678 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 2 Apr 2018 11:32:08 +0200 Subject: [PATCH 03/19] Add git to beta.framadate.org deploy so that we can be sure on which revision we're on Signed-off-by: Thomas Citharel --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a3039d0..392ebb7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,6 +48,7 @@ beta: - mkdir tpl_c - mkdir .public - cp -r * .public + - cp -r .git .public - mv .public public - mkdir "${HOME}/.ssh" - chmod 700 "${HOME}/.ssh" From d1870e516eea5ced3cb9edb2d255b88e5633343b Mon Sep 17 00:00:00 2001 From: m Date: Mon, 2 Apr 2018 09:12:51 +0200 Subject: [PATCH 04/19] =?UTF-8?q?Adresse=20e-mail=20d'un=20sondage=20avec?= =?UTF-8?q?=20SMTP=20d=C3=A9sactiv=C3=A9=20https://framagit.org/framasoft/?= =?UTF-8?q?framadate/issues/301?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit retour pour recherche d'une autre solution Adresse e-mail d'un sondage avec SMTP désactivé https://framagit.org/framasoft/framadate/issues/301 CS Signed-off-by: Thomas Citharel --- .../Framadate/Repositories/PollRepository.php | 62 ++++++++++++------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/app/classes/Framadate/Repositories/PollRepository.php b/app/classes/Framadate/Repositories/PollRepository.php index 0b8167b..5a11c0b 100644 --- a/app/classes/Framadate/Repositories/PollRepository.php +++ b/app/classes/Framadate/Repositories/PollRepository.php @@ -79,7 +79,7 @@ class PollRepository extends AbstractRepository { } /** - * Search polls in databse. + * Search polls in database. * * @param array $search Array of search : ['id'=>..., 'title'=>..., 'name'=>..., 'mail'=>...] * @param int $start The number of first entry to select @@ -88,28 +88,48 @@ class PollRepository extends AbstractRepository { */ public function findAll($search, $start, $limit) { // Polls - $prepared = $this->prepare(' -SELECT p.*, - (SELECT count(1) FROM `' . Utils::table('vote') . '` v WHERE p.id=v.poll_id) votes - FROM `' . Utils::table('poll') . '` p - WHERE (:id = "" OR p.id LIKE :id) - AND (:title = "" OR p.title LIKE :title) - AND (:name = "" OR p.admin_name LIKE :name) - AND (:mail = "" OR p.admin_mail LIKE :mail) - ORDER BY p.title ASC - LIMIT :start, :limit - '); - - $poll = $search['poll'] . '%'; - $title = '%' . $search['title'] . '%'; - $name = '%' . $search['name'] . '%'; - $mail = '%' . $search['mail'] . '%'; - $prepared->bindParam(':id', $poll, PDO::PARAM_STR); - $prepared->bindParam(':title', $title, PDO::PARAM_STR); - $prepared->bindParam(':name', $name, PDO::PARAM_STR); - $prepared->bindParam(':mail', $mail, PDO::PARAM_STR); + + $request = ""; + $request .= "SELECT p.*,"; + $request .= " (SELECT count(1) FROM `" . Utils::table('vote') . "` v WHERE p.id=v.poll_id) votes"; + $request .= " FROM `" . Utils::table('poll') . "` p"; + $request .= " WHERE 1"; + + $values = []; + + if (!empty($search["poll"])) { + $request .= " AND p.id LIKE :poll"; + $values["poll"] = "{$search["poll"]}%"; + } + + $fields = [ + // key of $search => column name + "title" => "title", + "name" => "admin_name", + "mail" => "admin_mail", + ]; + + foreach ($fields as $searchKey => $columnName) { + if (empty($search[$searchKey])) { + continue; + } + + $request .= " AND p.$columnName LIKE :$searchKey"; + $values[$searchKey] = "%{$search[$searchKey]}%"; + } + + $request .= " ORDER BY p.title ASC"; + $request .= " LIMIT :start, :limit"; + + $prepared = $this->prepare($request); + + foreach ($values as $searchKey => $value) { + $prepared->bindParam(":$searchKey", $value, PDO::PARAM_STR); + } + $prepared->bindParam(':start', $start, PDO::PARAM_INT); $prepared->bindParam(':limit', $limit, PDO::PARAM_INT); + $prepared->execute(); return $prepared->fetchAll(); From 9da92fd775cb4592522bbbea7cf22e0281d74969 Mon Sep 17 00:00:00 2001 From: Anael Date: Sun, 1 Apr 2018 23:13:15 +0200 Subject: [PATCH 05/19] issues 237, add trim function in order to delete the blank characters in mail input --- app/classes/Framadate/Services/InputService.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/classes/Framadate/Services/InputService.php b/app/classes/Framadate/Services/InputService.php index 2c5e1da..3b11e7e 100644 --- a/app/classes/Framadate/Services/InputService.php +++ b/app/classes/Framadate/Services/InputService.php @@ -65,6 +65,7 @@ class InputService { } public function filterMail($mail) { + $mail = trim($mail); return filter_var($mail, FILTER_VALIDATE_EMAIL); } From 1d8244fd99ff84935fa4b843d745f03a348594e7 Mon Sep 17 00:00:00 2001 From: Mathieu Date: Tue, 3 Apr 2018 12:30:37 +0200 Subject: [PATCH 06/19] =?UTF-8?q?=20correction=20:=20filtre=20adresse=20e-?= =?UTF-8?q?mail=20avec=20nom=20de=20domaine=20internationalis=C3=A9=20=20h?= =?UTF-8?q?ttps://framagit.org/framasoft/framadate/merge=5Frequests/268?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Framadate/Services/InputService.php | 42 ++--- composer.json | 3 +- composer.lock | 167 ++++++++++++------ 3 files changed, 127 insertions(+), 85 deletions(-) diff --git a/app/classes/Framadate/Services/InputService.php b/app/classes/Framadate/Services/InputService.php index 32283b1..5f30885 100644 --- a/app/classes/Framadate/Services/InputService.php +++ b/app/classes/Framadate/Services/InputService.php @@ -18,6 +18,8 @@ */ namespace Framadate\Services; use DateTime; +use Egulias\EmailValidator\EmailValidator; +use Egulias\EmailValidator\Validation\RFCValidation; /** * This class helps to clean all inputs from the users or external services. @@ -66,42 +68,24 @@ class InputService { public function filterMail($mail) { - $mail = mb_strtolower(trim($mail)); + /////////////////////////////////////////////////////////////////////////////////////// + // formatting + $mail = trim($mail); - $decoupage = explode("@", $mail, 2); + /////////////////////////////////////////////////////////////////////////////////////// + // e-mail validation $resultat = FALSE; - - if (isset($decoupage[1])) { - - $domaine = idn_to_ascii( - $decoupage[1] - , IDNA_DEFAULT - , INTL_IDNA_VARIANT_UTS46 - ); - - $adresseConvertie = "{$decoupage[0]}@$domaine"; - - $adresseFiltree = filter_var( - $adresseConvertie - , FILTER_VALIDATE_EMAIL - , ["flags" => FILTER_FLAG_EMAIL_UNICODE] // permet d'utiliser des accents avant le @ - ); - - if ($adresseConvertie === $adresseFiltree) { - - $testMX = getmxrr($domaine, $_); // tester sur le domaine indique un serveur MX - - if ($testMX) { - $resultat = $mail; - } - - } - + $validator = new EmailValidator(); + + if ($validator->isValid($mail, new RFCValidation())) { + $resultat = $mail; } + /////////////////////////////////////////////////////////////////////////////////////// + // return return $resultat; } diff --git a/composer.json b/composer.json index f48c4aa..d19901f 100644 --- a/composer.json +++ b/composer.json @@ -61,7 +61,8 @@ "phpmailer/phpmailer": "^5.2", "ircmaxell/password-compat": "dev-master", "roave/security-advisories": "dev-master", - "erusev/parsedown": "^1.7" + "erusev/parsedown": "^1.7", + "egulias/email-validator": "~2.1" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 6e33e0f..e855b8c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,119 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "a3ca2dd4f87562095f8c19a94560fed7", + "content-hash": "40759eac537218b0212ed923261b9850", "packages": [ + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09T13:34:57+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "1bec00a10039b823cc94eef4eddd47dcd3b2ca04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/1bec00a10039b823cc94eef4eddd47dcd3b2ca04", + "reference": "1bec00a10039b823cc94eef4eddd47dcd3b2ca04", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">= 5.5" + }, + "require-dev": { + "dominicsayers/isemail": "dev-master", + "phpunit/phpunit": "^4.8.35", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2017-11-15T23:40:40+00:00" + }, { "name": "erusev/parsedown", "version": "1.7.1", @@ -613,60 +724,6 @@ ], "time": "2015-06-14T21:17:01+00:00" }, - { - "name": "doctrine/lexer", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Lexer\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "lexer", - "parser" - ], - "time": "2014-09-09T13:34:57+00:00" - }, { "name": "friendsofphp/php-cs-fixer", "version": "v2.10.4", From 599f3104f6fc70efd0e90dc3c872d1b373cba51e Mon Sep 17 00:00:00 2001 From: m Date: Tue, 3 Apr 2018 13:21:47 +0200 Subject: [PATCH 07/19] new test for InputService -> filterMail --- .../Services/InputServiceUnitTest.php | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 app/tests/Framadate/Services/InputServiceUnitTest.php diff --git a/app/tests/Framadate/Services/InputServiceUnitTest.php b/app/tests/Framadate/Services/InputServiceUnitTest.php new file mode 100644 index 0000000..cbbb36d --- /dev/null +++ b/app/tests/Framadate/Services/InputServiceUnitTest.php @@ -0,0 +1,41 @@ +filterMail($email); + + $this->assertSame($expected, $filtered); + + } + + + function liste_emails() + { + + return [ + // valids addresses + "valid address" => ["example@example.com", "example@example.com"], + "local address" => ["test@localhost", "test@localhost"], + "IP address" => ["ip.email@127.0.0.1", "ip.email@127.0.0.1"], + "with spaces arround" => [" with@spaces ", "with@spaces"], + "unicode caracters" => ["unicode.éà@idn-œ.com", "unicode.éà@idn-œ.com"], + // invalids addresses + "without domain" => ["without-domain", FALSE], + "space inside" => ["example @example.com", FALSE], + "forbidden chars" => ["special_chars.)#@example.com", FALSE], + ]; + + } + +} From 6f257f416a461215bbce5828f54e3412cb226d93 Mon Sep 17 00:00:00 2001 From: m Date: Tue, 3 Apr 2018 14:09:18 +0200 Subject: [PATCH 08/19] fix code style --- .../Framadate/Services/InputService.php | 1 - .../Services/InputServiceUnitTest.php | 20 ++++++------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/app/classes/Framadate/Services/InputService.php b/app/classes/Framadate/Services/InputService.php index 5f30885..904fe95 100644 --- a/app/classes/Framadate/Services/InputService.php +++ b/app/classes/Framadate/Services/InputService.php @@ -67,7 +67,6 @@ class InputService { } public function filterMail($mail) { - /////////////////////////////////////////////////////////////////////////////////////// // formatting diff --git a/app/tests/Framadate/Services/InputServiceUnitTest.php b/app/tests/Framadate/Services/InputServiceUnitTest.php index cbbb36d..8e0abc0 100644 --- a/app/tests/Framadate/Services/InputServiceUnitTest.php +++ b/app/tests/Framadate/Services/InputServiceUnitTest.php @@ -3,26 +3,20 @@ namespace Framadate\Services; use Framadate\FramaTestCase; -class InputServiceUnitTest extends FramaTestCase { - +class InputServiceUnitTest extends FramaTestCase +{ /** * @test * @dataProvider liste_emails */ - function test_filterMail($email, $expected) - { - + function test_filterMail($email, $expected) { $inputService = new InputService(); $filtered = $inputService->filterMail($email); $this->assertSame($expected, $filtered); - } - - function liste_emails() - { - + function liste_emails() { return [ // valids addresses "valid address" => ["example@example.com", "example@example.com"], @@ -32,10 +26,8 @@ class InputServiceUnitTest extends FramaTestCase { "unicode caracters" => ["unicode.éà@idn-œ.com", "unicode.éà@idn-œ.com"], // invalids addresses "without domain" => ["without-domain", FALSE], - "space inside" => ["example @example.com", FALSE], - "forbidden chars" => ["special_chars.)#@example.com", FALSE], + "space inside" => ["example example@example.com", FALSE], + "forbidden chars" => ["special_chars.@example.com", FALSE], ]; - } - } From a003254c7d7e7a11c98a5f8b740b38be969b5291 Mon Sep 17 00:00:00 2001 From: m Date: Wed, 4 Apr 2018 20:03:55 +0200 Subject: [PATCH 09/19] =?UTF-8?q?Les=20mails=20aux=20sond=C3=A9s=20contena?= =?UTF-8?q?nt=20le=20lien=20d'=C3=A9dition=20du=20vote=20ne=20partent=20pa?= =?UTF-8?q?s=20https://framagit.org/framasoft/framadate/issues/221?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- action/send_edit_link_by_email_action.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action/send_edit_link_by_email_action.php b/action/send_edit_link_by_email_action.php index f5f2d54..a2ac204 100644 --- a/action/send_edit_link_by_email_action.php +++ b/action/send_edit_link_by_email_action.php @@ -79,7 +79,7 @@ if (is_null($message)) { $subject = '[' . NOMAPPLICATION . '][' . __('EditLink', 'REMINDER') . '] ' . __f('EditLink', 'Edit link for poll "%s"', $poll->title); - //$mailService->send($email, $subject, $body); + $mailService->send($email, $subject, $body); $sessionService->remove("Common", SESSION_EDIT_LINK_TOKEN); $sessionService->set("Common", SESSION_EDIT_LINK_TIME, time()); From 9ce586347b008e881c4d74f2b130e5d0c69fafaf Mon Sep 17 00:00:00 2001 From: Luc Didry Date: Thu, 5 Apr 2018 09:11:17 +0200 Subject: [PATCH 10/19] [i18n] Update translation --- locale/ar.json | 8 +++-- locale/br.json | 18 ++++++---- locale/de.json | 90 +++++++++++++++++++++++++---------------------- locale/en.json | 10 +++--- locale/es.json | 6 +++- locale/fr.json | 3 +- locale/fr_FR.json | 9 ++--- locale/it.json | 6 +++- locale/nl.json | 4 +++ locale/oc.json | 4 +++ 10 files changed, 94 insertions(+), 64 deletions(-) diff --git a/locale/ar.json b/locale/ar.json index ab63d52..bc1df27 100644 --- a/locale/ar.json +++ b/locale/ar.json @@ -122,6 +122,7 @@ "Enter a name and a comment!": "Enter a name and a comment!", "Enter a title": "Enter a title", "Enter an email address": "Enter an email address", + "Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: value must be an integer greater than 0", "Error!": "خطأ !", "Failed to delete all comments": "Failed to delete all comments", "Failed to delete all votes": "Failed to delete all votes", @@ -142,6 +143,8 @@ "Poll id already used": "Identifier is already used", "Something is going wrong...": "حدث هناك خطأ ما ...", "Something is wrong with the format": "Something is wrong with the format", + "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized urls should only consist of alphanumeric characters and hyphens.", + "Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.", "The column already exists": "The column already exists", "The name is invalid.": "The name is invalid.", @@ -182,7 +185,7 @@ "Edit": "تعديل", "Framadate is an online service for planning an appointment or make a decision quickly and easily.": "Framadate is an online service for planning an appointment or make a decision quickly and easily.", "Home": "الرئيسية", - "Ifneedbe": "Ifneedbe", + "Ifneedbe": "If need be", "Legend:": "Legend:", "Link": "الرابط", "Make your polls": "Make your polls", @@ -269,13 +272,14 @@ "Chart": "المنحنى البياني", "Display the chart of the results": "عرض المنحنى البياني للنتائج", "Edit the line: %s": "Edit line: %s", + "Link to edit this particular line": "Link to edit this particular line", "Remove the line:": "Remove line:", "Save the choices": "Save choices", "Scroll to the left": "Scroll to the left", "Scroll to the right": "Scroll to the right", "The best choice at this time is:": "The current best choice is:", "The bests choices at this time are:": "The current best choices are:", - "Vote ifneedbe for": "Vote \"ifneedbe\" for", + "Vote ifneedbe for": "Vote \"If need be\" for", "Vote no for": "Vote \"no\" for", "Vote yes for": "Vote \"yes\" for", "Votes of the poll": "الأصوات", diff --git a/locale/br.json b/locale/br.json index 11cdead..901335e 100644 --- a/locale/br.json +++ b/locale/br.json @@ -122,12 +122,13 @@ "Enter a name and a comment!": "Enankit un anv hag un evezhiadenn!", "Enter a title": "Ret eo enankañ un titl!", "Enter an email address": "Ret eo enankañ ur chomlec'h postel", + "Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: value must be an integer greater than 0", "Error!": "Fazi!", - "Failed to delete all comments": "Failed to delete all comments", - "Failed to delete all votes": "Failed to delete all votes", + "Failed to delete all comments": "C'hwitadenn en ur zilemel an holl evezhiadennoù", + "Failed to delete all votes": "C'hwitadenn en ur zilemel an holl vouezhioù", "Failed to delete column": "C'hwitadenn war zilemel ar bann", - "Failed to delete the comment": "Failed to delete the comment", - "Failed to delete the poll": "Failed to delete the poll", + "Failed to delete the comment": "C'hwitadenn en ur zilemel an evezhiadenn", + "Failed to delete the poll": "C'hwitadenn en ur zilemel ar sontadeg", "Failed to delete the vote!": "C'hwitadenn en ur zilemel ar vouezh!", "Failed to insert the comment!": "C'hwitadenn en ur enlakaat an evezhiadenn!", "Failed to save poll": "C'hwitadenn war enrolladenn ar sontadeg", @@ -142,6 +143,8 @@ "Poll id already used": "Arveret eo an naoudi endeo", "Something is going wrong...": "Un dra bennak a-dreuz a zo...", "Something is wrong with the format": "Un dra bennak a-dreuz a zo gant ar mentrezh", + "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized urls should only consist of alphanumeric characters and hyphens.", + "Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "Didalvoudek eo ar chomlec'h postel enanket. Ret eo lakaat ur chomlec'h postel talvoudek (skouer: mari-jo@gozmail.bzh)evit resevout ere ar sontadeg.", "The column already exists": "Ar bann a zo anezhañ endeo", "The name is invalid.": "Didalvoudek eo an anv.", @@ -269,6 +272,7 @@ "Chart": "Diervad", "Display the chart of the results": "Skrammañ diervad an disoc'hoù", "Edit the line: %s": "Kemmañ al linenn: %s", + "Link to edit this particular line": "Link to edit this particular line", "Remove the line:": "Dilemel al linenn:", "Save the choices": "Enrollañ an dibaboù", "Scroll to the left": "Dibunañ d'an tu kleiz", @@ -328,7 +332,7 @@ "All voters can modify any vote": "An holl vouezhierien a c'hall kemmañ an holl vouezhioù", "Customize the URL": "Personelaat an ere", "Go to step 2": "Mont d'ar bazenn 2", - "Limit the amount of voters per option": "Limit the amount of voters per option", + "Limit the amount of voters per option": "Bevenniñ an niver a vouezhierien dre zibab", "More informations here:": "Titouroù ouzhpenn amañ:", "Only the poll maker can see the poll's results": "N'eus nemet krouer ar sontadeg a c'hell gwelet an disoc'hoù", "Optional parameters": "Arventennoù diret", @@ -347,8 +351,8 @@ "To receive an email for each new comment": "Degemer ur postel evit pep evezhiadenn nevez", "To receive an email for each new vote": "Degemer ur postel evit pep mouezh nevez", "Use a password to restrict access": "Lakaat ur ger-tremen evit bevenniñ an haeziñ", - "Value Max": "Value Max", - "ValueMax instructions": "voters per options ", + "Value Max": "Talvoud uc'hek", + "ValueMax instructions": "mouezhier dre zibab", "Voters can modify their vote themselves": "Pep mouezhier a c'hell kemmañ e vouezh", "Votes cannot be modified": "N'hall ket ar mouezhioù bezañ kemmet", "You are in the poll creation section.": "Dibabet ho peus krouiñ ur sontadeg nevez.", diff --git a/locale/de.json b/locale/de.json index cd13108..064f127 100644 --- a/locale/de.json +++ b/locale/de.json @@ -3,7 +3,7 @@ "Define dates or subjects to choose": "Zeitpunkte oder andere Alternativen zur Auswahl stellen", "Discuss and make a decision": "Besprechen und Entscheidungen treffen", "Do you want to": "Wollen Sie sich", - "Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.": "Framadate ist ein Online-Dienst, der Ihnen bei der Absprache von Terminen oder der Entscheidungsfindung hilft. Es ist keinerlei Registrierung erforderlich.", + "Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.": "Framadate ist ein Online-Dienst, der Ihnen bei der Absprache von Terminen oder der Entscheidungsfindung hilft. Es ist keine Registrierung erforderlich.", "Here is how it works:": "So funktioniert es:", "Make a poll": "Umfrage erstellen", "Send the poll link to your friends or colleagues": "Link zur Umfrage an Ihre Freunde oder Kollegen schicken", @@ -60,10 +60,10 @@ "Check again": "Erneut prüfen", "Consider enabling the PHP extension OpenSSL for increased security.": "Ziehen Sie in Erwägung, für eine verbesserte Sicherheit die OpenSSL-Erweiterung zu aktivieren.", "Consider setting the date.timezone in php.ini.": "Ziehen Sie in Erwägung, date.timezone in php.ini zu konfigurieren.", - "Consider setting « session.cookie_httponly = 1 » inside your php.ini or add « php_value session.cookie_httponly 1 » to your .htaccess so that cookies can't be accessed through Javascript.": "DE_Consider setting « session.cookie_httponly = 1 » inside your php.ini or add « php_value session.cookie_httponly 1 » to your .htaccess so that cookies can't be accessed through Javascript.", + "Consider setting « session.cookie_httponly = 1 » inside your php.ini or add « php_value session.cookie_httponly 1 » to your .htaccess so that cookies can't be accessed through Javascript.": "Setzen Sie « session.cookie_httponly = 1 » in Ihrer php.ini oder fügen Sie « php_value session.cookie_httponly 1 » Ihrer .htaccess Datei hinzu so dass auf Cookies nicht per Javascript zugegriffen werden kann.", "Continue the installation": "Installation fortsetzen", - "Cookies are served from HTTP only.": "DE_Cookies are served from HTTP only.", - "Installation checking": "Verifikation der Installation", + "Cookies are served from HTTP only.": "Cookies werden nur über HTTP ausgeliefert.", + "Installation checking": "Überprüfung der Installation", "OpenSSL extension loaded.": "Die OpenSSL-Erweiterung ist geladen.", "PHP Intl extension is enabled.": "Die PHP-Erweiterung Intl ist aktiviert.", "PHP version %s is enough (needed at least PHP %s).": "PHP Version %s ist ausreichend (mindestens PHP %s wird benötigt).", @@ -119,15 +119,16 @@ "Comment failed": "Abgabe des Kommentars gescheitert", "Cookies are disabled on your browser. Theirs activation is required to create a poll.": "Cookies werden von Ihrem Browser abgelehnt. Um eine Umfrage zu erstellen, müssen Sie sie akzeptieren.", "Enter a name": "Geben Sie einen Namen ein", - "Enter a name and a comment!": "Geben Sie einen Namen und ein Kommentar ein!", + "Enter a name and a comment!": "Geben Sie einen Namen und einen Kommentar ein!", "Enter a title": "Titel eingeben", "Enter an email address": "Geben Sie eine E-Mail Adresse ein", + "Error on amount of voters limitation : value must be an integer greater than 0": "Wählerzahlbegrenzung ist falsch: Wert muss größer als 0 sein.", "Error!": "Fehler!", - "Failed to delete all comments": "Alle kommentare konnten nicht gelöscht werden.", - "Failed to delete all votes": "Alle stimmen konnten nicht gelöscht werden.", + "Failed to delete all comments": "Alle Kommentare konnten nicht gelöscht werden.", + "Failed to delete all votes": "Alle Stimmen konnten nicht gelöscht werden.", "Failed to delete column": "Löschen der Spalte fehlgeschlagen", - "Failed to delete the comment": "Der kommentar konnte nicht gelöscht werden.", - "Failed to delete the poll": "Die umfrage konnte nicht gelöscht werden.", + "Failed to delete the comment": "Der Kommentar konnte nicht gelöscht werden.", + "Failed to delete the poll": "Die Umfrage konnte nicht gelöscht werden.", "Failed to delete the vote!": "Löschen der Wertung gescheitert!", "Failed to insert the comment!": "Einfügen des Kommentars gescheitert!", "Failed to save poll": "Speichern der Umfrage fehlgeschlagen", @@ -140,29 +141,31 @@ "Passwords do not match": "Die Passwörter stimmen nicht überein.", "Poll has been updated before you vote": "Die Abstimmung wurde vor Ihrer Stimmabgabe aktualisiert", "Poll id already used": "Der Bezeichner ist bereits in Verwendung", - "Something is going wrong...": "Etwas geht schief...", + "Something is going wrong...": "Etwas ging schief ...", "Something is wrong with the format": "Mit dem Format stimmt etwas nicht", + "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Etwas ist falsch mit dem Format: Persönliche URLs dürfen nur aus alphanumerischen Zeichen und Bindestrichen bestehen.", + "Something is wrong with the format: name shouldn't have any spaces before or after": "Etwas ist falsch mit dem Format: Es sollte kein Leerzeichen vor oder nach dem Namen stehen.", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "Die Adresse ist nicht korrekt! Sie sollten eine gültige E-Mail-Adresse angeben, damit Ihnen der Link zur Umfrage zugeschickt werden kann.", "The column already exists": "Die Spalte existiert bereits", "The name is invalid.": "Der Name ist ungültig.", - "The name you've chosen already exist in this poll!": "Der von Ihnen eingegebenen Name existiert schon in dieser Umfrage", - "There is a problem with your choices": "Es gibt ein Problem mit Ihren Alternativen", + "The name you've chosen already exist in this poll!": "Der von Ihnen eingegebene Name existiert schon in dieser Umfrage!", + "There is a problem with your choices": "Es gibt ein Problem mit Ihrer Auswahl", "This poll doesn't exist !": "Diese Umfrage existiert nicht!", - "Update vote failed": "Aktualisierung der Wertung fehlgeschlagen", + "Update vote failed": "Aktualisierung der Stimme fehlgeschlagen", "You already voted": "Sie haben bereits abgestimmt", "You can't create a poll with hidden results with the following edition option:": "Sie können mit der folgenden Editier-Option keine Umfrage mit versteckten Ergebnissen erzeugen:", "You can't select more than %d dates": "Es können nicht mehr als %d Termine ausgewählt werden", "You haven't filled the first section of the poll creation.": "Sie haben den ersten Teil der Umfrageerstellung nicht ausgefüllt.", - "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry." + "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Ihre Stimme wurde nicht gezählt, da jemand in der Zwischenzeit gewählt hat und dies mit Ihrer Abstimmung und den Umfrage-Bestimmungen in Konflikt stand. Bitte versuchen Sie es erneut." }, "FindPolls": { "Have a good day!": "Einen schönen Tag noch!", "Here is the list of the polls that you manage on %s:": "Hier ist die Liste der Umfragen die Sie auf %s verwalten:", - "If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Wenn Sie diesen Vorgang nicht veranlasst haben und glauben dass dieser Dienst missbraucht wurde, benachrichtene Sie bitte den Administrator auf %s.", + "If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Wenn Sie diesen Vorgang nicht veranlasst haben und glauben dass dieser Dienst missbraucht wurde, benachrichtigen Sie bitte den Administrator auf %s.", "List of your polls": "Liste Ihrer Umfragen", "PS: this email has been sent because you – or someone else – asked to get back the polls created with your email address.": "PS : Diese E-Mail wurde abgeschickt weil Sie – oder jemand anderes – Zugriff auf die mit Ihrer E-Mail-Adresse angelegten Umfragen angefordert hat.", "Polls sent": "Umfragen abgeschickt", - "Send me my polls": "Senden Sie mir mein Umfragen" + "Send me my polls": "Senden Sie mir meine Umfragen" }, "Generic": { "(in the format name@mail.com)": "(Format: name@mail.com)", @@ -182,7 +185,7 @@ "Edit": "Bearbeiten", "Framadate is an online service for planning an appointment or make a decision quickly and easily.": "Framadate ist ein Online-Dienst, der Ihnen bei der Absprache von Terminen oder der Entscheidungsfindung hilft.", "Home": "Startseite", - "Ifneedbe": "Wenn notwendig", + "Ifneedbe": "Wenn nötig", "Legend:": "Legende:", "Link": "Link", "Make your polls": "Eigene Umfragen erstellen", @@ -233,7 +236,7 @@ }, "Mail": { "Author's message": "Nachricht vom Autor ", - "FOOTER": "„Die Strecke ist lang, aber der Weg ist frei… »
Framasoft besteht nur durch Ihre Spenden (in Frankreich von der Steuer absetzba).
Herzlichen Dank für Ihre Unterstützung https://soutenir.framasoft.org", + "FOOTER": "„Die Strecke ist lang, aber der Weg ist frei… \"
Framasoft besteht nur durch Ihre Spenden (in Frankreich von der Steuer absetzbar).
Herzlichen Dank für Ihre Unterstützung https://soutenir.framasoft.org", "For sending to the polled users": "Nachricht für die Teilnehmer", "Notification of poll: %s": "Mitteilung bezüglich der Umfrage: %s", "Poll's participation: %s": "Beteiligung an der Umfrage: %s", @@ -241,7 +244,7 @@ "Someone just delete your poll %s.": "Jemand hat gerade Ihre Umfrage auf %s gelöscht.", "Thanks for filling the poll at the link above": "Danke, dass Sie die Umfrage unter dem obigen Link ausgefüllt haben", "Thanks for your trust.": "Danke für Ihr Vertrauen.", - "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Dies ist die Nachricht an die Leute, die Sie zur Abstimmung bitten.", + "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Dies ist die Nachricht an die Umfrageteilnehmer.", "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Diese Meldung sollte NICHT an die befragten Personen gesendet werden. Sie sollten sie für sich behalten.

Sie können Ihre Umfrage über den oben genannten Link abändern", "You have changed the settings of your poll. \nYou can modify this poll with this link": "Sie haben die Einstellungen Ihrer Umfrage verändert.
Sie können diese Umfrage über diesen Link ändern", "[ADMINISTRATOR] New settings for your poll": "[ADMINISTRATOR] Neue Einstellungen für Ihre Umfrage ", @@ -252,7 +255,7 @@ }, "Maintenance": { "Thank you for your understanding.": "Danke für Ihr Verständnis.", - "The application": "die Anwendung", + "The application": "Die Anwendung", "is currently under maintenance.": "wird gerade gewartet." }, "Password": { @@ -269,6 +272,7 @@ "Chart": "Grafik", "Display the chart of the results": "Ergebnisgrafik anzeigen", "Edit the line: %s": "Zeile bearbeiten: %s", + "Link to edit this particular line": "Link to edit this particular line", "Remove the line:": "Zeile entfernen:", "Save the choices": "Wahl speichern", "Scroll to the left": "Nach links scrollen", @@ -285,7 +289,7 @@ "PollInfo": { "Admin link of the poll": "Administrationsseite der Umfrage", "Cancel the description edit": "Änderungen der Beschreibung verwerfen", - "Cancel the email address edit": "Abbruch, Mail-Adresse nicht ändern", + "Cancel the email address edit": "Abbruch, E-Mail-Adresse nicht ändern", "Cancel the expiration date edit": "Abbruch, Ablaufdatum nicht ändern", "Cancel the name edit": "Abbruch, Namen nicht ändern", "Cancel the rules edit": "Abbruch, Regeln nicht ändern", @@ -312,14 +316,14 @@ "Remove the poll": "Umfrage löschen", "Results are hidden": "Ergebnisse werden ausgeblendet", "Results are visible": "Ergebnisse sind sichtbar", - "Rich editor": "DE_Editeur avancé", + "Rich editor": "Rich Text Editor", "Save the description": "Beschreibung speichern", "Save the email address": "Speichern Sie die E-Mail-Adresse", "Save the new expiration date": "Speichern Sie das neue Ablaufdatum", "Save the new name": "Speichern Sie den neuen Namen", "Save the new rules": "Neue Regeln speichern", "Save the new title": "Den neuen Titel speichern", - "Simple editor": "DE_Editeur simple", + "Simple editor": "Einfacher Editor", "Title": "Titel", "Votes and comments are locked": "Wertungen und Kommentare sind gesperrt", "Votes protected by password": "Wertungen sind passwortgeschützt" @@ -328,8 +332,8 @@ "All voters can modify any vote": "Jeder Teilnehmer kann jede abgegebene Wertung ändern", "Customize the URL": "Link anpassen", "Go to step 2": "Weiter zum 2. Schritt", - "Limit the amount of voters per option": "Begrenzung der anzahl der aähler pro option", - "More informations here:": "DE_Plus d'informations ici :", + "Limit the amount of voters per option": "Anzahl der Stimmen pro Option begrenzen", + "More informations here:": "Weitere Informationen gibt es hier:", "Only the poll maker can see the poll's results": "Einzig der Autor der Abstimmung kann die Ergebnisse einsehen", "Optional parameters": "Optionale Einstellungen", "Password choice": "Passwortauswahl", @@ -337,22 +341,22 @@ "Permissions": "Berechtigungen", "Poll creation (1 on 3)": "Umfrage erstellen (Schritt 1 von 3)", "Poll id": "Bezeichner", - "Poll id rules": "Der Bezeichner kann Buchstaben, Zahlen und Bindestriche enhalten \"-\".", + "Poll id rules": "Der Bezeichner kann Buchstaben, Zahlen und Bindestriche \"-\" enthalten.", "Poll id warning": "Mit der Verwendung eines Bezeichners können möglicherweise Personen unerwünscht Zugriff auf die Umfrage erhalten. Es wird empfohlen sie mit einem Passwort zu schützen.", "Poll password": "Passwort", "Poll title": "Titel der Umfrage", "Required fields cannot be left blank.": "Mit * markierte Felder müssen ausgefüllt sein.", - "The results are publicly visible": "Die Ergebnisse sind öffentlich Einsehbar", - "To make the description more attractive, you can use the Markdown format.": "DE_Afin de rendre le descriptif de ce sondage plus attractif, vous pouvez utiliser le formatage Markdown.", + "The results are publicly visible": "Die Ergebnisse sind öffentlich einsehbar", + "To make the description more attractive, you can use the Markdown format.": "Sie können das Markdown Format nutzen um die Beschreibung attraktiver zu gestalten.", "To receive an email for each new comment": "Bei jedem neuen Kommentar eine E-Mail erhalten", "To receive an email for each new vote": "Bei jeder neuen Wertung eine E-Mail erhalten", "Use a password to restrict access": "Verwende ein Passwort um den Zugriff zu beschänken", "Value Max": "Wert Max", - "ValueMax instructions": "wähler pro option ", + "ValueMax instructions": "Stimmen pro Option ", "Voters can modify their vote themselves": "Teilnehmer können ihre Wertungen verändern", "Votes cannot be modified": "Wertungen können nicht verändert werden", "You are in the poll creation section.": "Hier erstellen Sie die Umfrage", - "You can enable or disable the editor at will.": "DE_Vous pouvez activer ou désactiver l'éditeur à votre guise." + "You can enable or disable the editor at will.": "Sie können den Editor nach Belieben ein- und wieder ausschalten." }, "Step 2": { "Back to step 1": "Zurück zum 1. Schritt", @@ -367,16 +371,16 @@ "Remove a choice": "Eine Auswahlmöglichkeit entfernen", "These fields are optional. You can add a link, an image or both.": "Diese Felder sind optional. Sie können einen Link, ein Bild oder beides hinzufügen.", "To make a generic poll you need to propose at least two choices between differents subjects.": "Um eine gewöhnliche Umfrage zu erstellen, müssen Sie mindestens zwei Alternativen zur Auswahl stellen.", - "URL of the image": "URL des Bilds", + "URL of the image": "URL des Bildes", "You can add or remove additional choices with the buttons": "Um Auswahlmöglichkeiten hinzuzufügen oder zu entfernen, verwenden Sie die Buttons", "the Markdown syntax": "Markdown Syntax" }, "Step 2 date": { "Add a day": "Einen Tag hinzufügen", "Add an hour": "Eine Uhrzeit hinzufügen", - "Choose the dates of your poll": "Machen Sie Treminvorschläge für Ihre Umfrage", + "Choose the dates of your poll": "Machen Sie Terminvorschläge für Ihre Umfrage", "Copy hours of the first day": "Uhrzeiten des ersten Tags kopieren", - "For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "Für jeden ausgewählten Tag können Sie fakultativ Uhrzeiten festlegen (z.B.: \"8h\", \"8:30\", \"8h-10h\", \"abends\", usw.)", + "For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "Für jeden ausgewählten Tag können Sie fakultativ Uhrzeiten vorschlagen (z. B.: \"8h\", \"8:30\", \"8h-10h\", \"abends\", usw.)", "Poll dates (2 on 3)": "Umfragedaten (2 von 3)", "Remove a day": "Einen Tag entfernen", "Remove all days": "Alle Tage entfernen", @@ -394,10 +398,10 @@ "List of your choices": "Liste Ihrer Auswahlmöglichkeiten", "Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.": "Wenn Sie die Erzeugung ihrer Umfrage bestätigt haben, werden sie automatisch zur Administrationsseite ihrer Umfrage weitergeleitet.", "Removal date and confirmation (3 on 3)": "Abstimmungszeitraum und Bestätigung (3 von 3)", - "Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "Sie werden zwei E-Mails erhalten: die Eine enthält den Link zur Umfrage für die Teilnehmer, die andere den zur Administrationsseite für Ihre Umfrage.", + "Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "Sie werden zwei E-Mails erhalten: Die eine enthält den Link zur Umfrage für die Teilnehmer, die andere den Link zur Administrationsseite für Ihre Umfrage.", "You can set a closer archiving date for it.": "Sie können das Datum der Archivierung vorverlegen.", - "Your poll will automatically be archived": "Ihre Umfrage wird automatisch", - "Your poll will be automatically archived in %d days.": "Ihre Umfrage wird automatisch in %d Tage archiviert werden.", + "Your poll will automatically be archived": "Ihre Umfrage wird automatisch archiviert", + "Your poll will be automatically archived in %d days.": "Ihre Umfrage wird automatisch in %d Tagen archiviert werden.", "after the last date of your poll.": "nach dem letzten Termin der Abstimmung archiviert." }, "adminstuds": { @@ -406,7 +410,7 @@ "All votes deleted": "Alle Wertungen werden gelöscht", "As poll administrator, you can change all the lines of this poll with this button": "Als Administrator der Umfrage können Sie alle Zeilen der Umfrage über diesen Button ändern", "Back to the poll": "Zurück zur Umfrage", - "Choice added": "Alternative hinzugefügt", + "Choice added": "Option hinzugefügt", "Column removed": "Spalte entfernt", "Column's adding": "Spalte hinzufügen", "Comment deleted": "Kommentar gelöscht", @@ -415,8 +419,8 @@ "Confirm removal of the column.": "Bestätigen Sie die Entfernung der Spalte", "Confirm removal of the poll": "Bestätigen Sie die Löschung ihrer Umfrage", "Delete the poll": "Umfrage löschen", - "Finally, you can change the informations of this poll like the title, the comments or your email address.": "Schließlich können Sie die Informationen wie Titel, Kommentare oder Ihre E-Mail-Adresse ändern.", - "If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Wenn Sie nur eine neue Uhrzeiteit zu einem vorhandenen Datum hinzufügen möchten, geben Sie das selbe Datum an und wählen Sie eine neue Uhrzeit aus.", + "Finally, you can change the informations of this poll like the title, the comments or your email address.": "Schließlich können Sie Informationen wie Titel, Kommentare oder Ihre E-Mail-Adresse ändern.", + "If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Wenn Sie nur eine neue Uhrzeit zu einem vorhandenen Datum hinzufügen möchten, geben Sie das selbe Datum an und wählen Sie eine neue Uhrzeit aus.", "Keep comments": "Kommentare beibehalten", "Keep the comments": "Kommentare beibehalten", "Keep the poll": "Umfrage beibehalten", @@ -428,9 +432,9 @@ "Remove the column": "Spalte entfernen", "Remove the comments": "Kommentare entfernen", "Remove the votes": "Entfernen Sie die Stimmen", - "Vote added": "Wertung hinzugefügt", - "Vote deleted": "Wertung gelöscht", - "Vote updated": "Wertung aktualisiert", + "Vote added": "Stimme hinzugefügt", + "Vote deleted": "Stimme gelöscht", + "Vote updated": "Stimme aktualisiert", "You can add a new scheduling date to your poll.": "Sie können Ihrer Umfrage ein neues Datum hinzufügen.", "Your poll has been removed!": "Ihre Umfrage wurde gelöscht!", "and add a new column with": "und neue Spalte hinzufügen mit", @@ -440,7 +444,7 @@ "Adding the vote succeeded": "Die Wertung wurde hinzugefügt", "Deletion date:": "Löschdatum:", "If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Wenn Sie an dieser Umfrage teilnehmen möchten, müssen Sie ihren Namen angeben, die Auswahl treffen, die Ihnen am ehesten zusagt und mit dem Plus-Button am Ende der Zeile bestätigen.", - "POLL_LOCKED_WARNING": "Die Abstimmung wurde vom Administrator gesperrt. Bewertungen und Kommentare werden eingefroren; es ist nicht mehr möglich, teilzunehmen", + "POLL_LOCKED_WARNING": "Die Abstimmung wurde vom Administrator gesperrt. Bewertungen und Kommentare werden eingefroren; es ist nicht mehr möglich teilzunehmen", "The poll is expired, it will be deleted soon.": "Der Zeitraum für die Umfrage ist überschritten, sie wird bald gelöscht werden.", "Update vote succeeded": "Die Wertung wurde geändert", "Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote:": "Ihre Stimme wurde gezählt, aber beachten Sie, dass diese Umfrage die nachträgliche Änderung Ihrer Wertung nur über den nachfolgend genannten, personalisierten Link erlaubt; verwahren Sie ihn an einem sicheren Ort!" diff --git a/locale/en.json b/locale/en.json index a0a3519..0e89f07 100644 --- a/locale/en.json +++ b/locale/en.json @@ -122,6 +122,7 @@ "Enter a name and a comment!": "Enter a name and a comment!", "Enter a title": "Enter a title", "Enter an email address": "Enter an email address", + "Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: value must be an integer greater than 0", "Error!": "Error!", "Failed to delete all comments": "Failed to delete all comments", "Failed to delete all votes": "Failed to delete all votes", @@ -142,10 +143,9 @@ "Poll id already used": "Identifier is already used", "Something is going wrong...": "Something has gone wrong...", "Something is wrong with the format": "Something is wrong with the format", - "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.", + "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized urls should only consist of alphanumeric characters and hyphens.", "Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.", - "Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation : value must be an integer greater than 0", "The column already exists": "The column already exists", "The name is invalid.": "The name is invalid.", "The name you've chosen already exist in this poll!": "The name you've chosen already exists in this poll!", @@ -272,19 +272,19 @@ "Chart": "Chart", "Display the chart of the results": "Display the chart of the results", "Edit the line: %s": "Edit line: %s", + "Link to edit this particular line": "Link to edit this particular line", "Remove the line:": "Remove line:", "Save the choices": "Save choices", "Scroll to the left": "Scroll to the left", "Scroll to the right": "Scroll to the right", "The best choice at this time is:": "The current best choice is:", "The bests choices at this time are:": "The current best choices are:", - "Vote ifneedbe for": "Vote \"ifneedbe\" for", + "Vote ifneedbe for": "Vote \"If need be\" for", "Vote no for": "Vote \"no\" for", "Vote yes for": "Vote \"yes\" for", "Votes of the poll": "Votes", "polled user": "polled user", - "polled users": "polled users", - "Link to edit this particular line" : "Link to edit this particular line" + "polled users": "polled users" }, "PollInfo": { "Admin link of the poll": "Admin link for the poll", diff --git a/locale/es.json b/locale/es.json index 66f9aae..88ee450 100644 --- a/locale/es.json +++ b/locale/es.json @@ -122,6 +122,7 @@ "Enter a name and a comment!": "Introduzca su nombre y un comentario", "Enter a title": "Introducza un título", "Enter an email address": "Introduzca un correo electrónico", + "Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: value must be an integer greater than 0", "Error!": "¡Error!", "Failed to delete all comments": "No se han eliminado todos los comentarios", "Failed to delete all votes": "No se han eliminado todos los votos", @@ -142,6 +143,8 @@ "Poll id already used": "ES_L'identifiant est déjà utilisé", "Something is going wrong...": "Algo anda mal...", "Something is wrong with the format": "Algo está mal con el formato", + "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized urls should only consist of alphanumeric characters and hyphens.", + "Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "El correo electrónico es incorrecto. Tiene que introducir una dirección cálida (por ejemplo r.stallman@outlook.com) para recibir el enlace de su encuesta.", "The column already exists": "La columna ya existe", "The name is invalid.": "Este nombre es invalido.", @@ -241,7 +244,7 @@ "Someone just delete your poll %s.": "Alguien acaba de borrar su encuesta \"%s\".", "Thanks for filling the poll at the link above": "Gracias por ir a llenar la encuesta siguiendo este enlace", "Thanks for your trust.": "Gracias por su confianza.", - "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Este es el mensaje que puede enviar a todos los votantes.
Ahora puede transmitir Voueste mensaje para todas las personas susceptibles de participar al voto.", + "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Este es el mensaje que puede enviar a todos los votantes.", "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Este mensaje NO tiene que ser difundido a los votantes. Es reservado para el autor de la encuesta.

Puede modificar esta encuesta en el enlace siguiente ", "You have changed the settings of your poll. \nYou can modify this poll with this link": "Acaba de cambiar los parámetros de su encuestra.
Puede seguir modificando la encuesta siguiendo este enlace", "[ADMINISTRATOR] New settings for your poll": "[ADMINISTRACIÓN] Cambio de configuración de la encuesta", @@ -269,6 +272,7 @@ "Chart": "Gráfico", "Display the chart of the results": "Mostrar el gráfico de resultados", "Edit the line: %s": "Modificar la fila: %s", + "Link to edit this particular line": "Link to edit this particular line", "Remove the line:": "Borrar la fila:", "Save the choices": "Guardar los cambios", "Scroll to the left": "Hacer desfilar hacia la izquierda", diff --git a/locale/fr.json b/locale/fr.json index 911e525..bfb87a4 100644 --- a/locale/fr.json +++ b/locale/fr.json @@ -122,6 +122,7 @@ "Enter a name and a comment!": "Merci de remplir les deux champs !", "Enter a title": "Il faut saisir un titre !", "Enter an email address": "Il faut saisir une adresse électronique !", + "Error on amount of voters limitation : value must be an integer greater than 0": "Erreur sur le nombre maximum de votants : la valeur doit être un entier supérieur à 0", "Error!": "Erreur !", "Failed to delete all comments": "Impossible de supprimer tous les commentaires", "Failed to delete all votes": "Impossible de supprimer tous les votes", @@ -145,7 +146,6 @@ "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Quelque chose ne va pas avec le format: les urls personalisées devraient contenir uniquement des caractères alphanumériques et des tirets.", "Something is wrong with the format: name shouldn't have any spaces before or after": "Quelque chose ne va pas avec le format : le nom ne devrait pas contenir d'espaces avant ou après", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "L'adresse saisie n'est pas correcte ! Il faut une adresse électronique valide (par exemple r.stallman@outlock.com) pour recevoir le lien vers le sondage.", - "Error on amount of voters limitation : value must be an integer greater than 0": "Erreur sur le nombre maximum de votants : la valeur doit être un entier supérieur à 0", "The column already exists": "La colonne existe déjà", "The name is invalid.": "Le nom n'est pas valide.", "The name you've chosen already exist in this poll!": "Le nom que vous avez choisi existe déjà !", @@ -272,6 +272,7 @@ "Chart": "Graphique", "Display the chart of the results": "Afficher le graphique des résultats", "Edit the line: %s": "Modifier la ligne : %s", + "Link to edit this particular line": "Lien pour éditer cette ligne", "Remove the line:": "Supprimer la ligne :", "Save the choices": "Enregistrer les choix", "Scroll to the left": "Faire défiler à gauche", diff --git a/locale/fr_FR.json b/locale/fr_FR.json index f995955..bfb87a4 100644 --- a/locale/fr_FR.json +++ b/locale/fr_FR.json @@ -122,6 +122,7 @@ "Enter a name and a comment!": "Merci de remplir les deux champs !", "Enter a title": "Il faut saisir un titre !", "Enter an email address": "Il faut saisir une adresse électronique !", + "Error on amount of voters limitation : value must be an integer greater than 0": "Erreur sur le nombre maximum de votants : la valeur doit être un entier supérieur à 0", "Error!": "Erreur !", "Failed to delete all comments": "Impossible de supprimer tous les commentaires", "Failed to delete all votes": "Impossible de supprimer tous les votes", @@ -142,10 +143,9 @@ "Poll id already used": "L'identifiant est déjà utilisé", "Something is going wrong...": "Quelque chose ne va pas...", "Something is wrong with the format": "Quelque chose ne va pas avec le format", - "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Quelque chose ne va pas avec le format : les urls personalisées devraient contenir uniquement des caractères alphanumériques et des tirets.", + "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Quelque chose ne va pas avec le format: les urls personalisées devraient contenir uniquement des caractères alphanumériques et des tirets.", "Something is wrong with the format: name shouldn't have any spaces before or after": "Quelque chose ne va pas avec le format : le nom ne devrait pas contenir d'espaces avant ou après", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "L'adresse saisie n'est pas correcte ! Il faut une adresse électronique valide (par exemple r.stallman@outlock.com) pour recevoir le lien vers le sondage.", - "Error on amount of voters limitation : value must be an integer greater than 0": "Erreur sur le nombre maximum de votants : la valeur doit être un entier supérieur à 0", "The column already exists": "La colonne existe déjà", "The name is invalid.": "Le nom n'est pas valide.", "The name you've chosen already exist in this poll!": "Le nom que vous avez choisi existe déjà !", @@ -272,6 +272,7 @@ "Chart": "Graphique", "Display the chart of the results": "Afficher le graphique des résultats", "Edit the line: %s": "Modifier la ligne : %s", + "Link to edit this particular line": "Lien pour éditer cette ligne", "Remove the line:": "Supprimer la ligne :", "Save the choices": "Enregistrer les choix", "Scroll to the left": "Faire défiler à gauche", @@ -331,9 +332,9 @@ "All voters can modify any vote": "Tou·te·s les sondé·e·s peuvent modifier tous les votes", "Customize the URL": "Personnaliser le lien", "Go to step 2": "Aller à l'étape 2", - "Limit the amount of voters per option": "limiter le nombre de votants par option", + "Limit the amount of voters per option": "Limiter le nombre de votant·e·s par option", "More informations here:": "Plus d'informations ici :", - "Only the poll maker can see the poll's results": "Seul le ou la créateur·rice du sondage peut voir les résultats", + "Only the poll maker can see the poll's results": "Seul·e le ou la créateur·rice du sondage peut voir les résultats", "Optional parameters": "Paramètres facultatifs", "Password choice": "Choix", "Password confirmation": "Confirmation", diff --git a/locale/it.json b/locale/it.json index 6bfa519..3a287d2 100644 --- a/locale/it.json +++ b/locale/it.json @@ -122,6 +122,7 @@ "Enter a name and a comment!": "Inserire un nome e un commento!", "Enter a title": "È necessario inserire un titolo !", "Enter an email address": "È necessario inserire un indirizzo e-mail!", + "Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: value must be an integer greater than 0", "Error!": "Errore!", "Failed to delete all comments": "Impossibile eliminare tutti i commenti", "Failed to delete all votes": "Impossibile eliminare tutti i voti", @@ -142,6 +143,8 @@ "Poll id already used": "L'identificativo del sondaggio è già in uso", "Something is going wrong...": "Qualcosa non è corretto...", "Something is wrong with the format": "Qualche errore nel formato", + "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized urls should only consist of alphanumeric characters and hyphens.", + "Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "L'indirizzo inserito non è corretto ! È necessario un indirizzo e-mail valido (per esempio r.stallman@outlock.com) per ricevere il link del sondaggio.", "The column already exists": "La colonna esiste già", "The name is invalid.": "Nome non valido.", @@ -269,6 +272,7 @@ "Chart": "Grafico", "Display the chart of the results": "Mostra il grafico dei risultati", "Edit the line: %s": "Modificare la riga : %s", + "Link to edit this particular line": "Link to edit this particular line", "Remove the line:": "Eliminare la riga :", "Save the choices": "Salvare le scelte", "Scroll to the left": "Spostare a sinistra", @@ -328,7 +332,7 @@ "All voters can modify any vote": "Tutti i votanti possono cambiare tutti i voti", "Customize the URL": "Personalizzare il link", "Go to step 2": "Andare al punto 2", - "Limit the amount of voters per option": "Limitare la quantità di elettori per opzione", + "Limit the amount of voters per option": "Limitate la quantità di votanti per opzione", "More informations here:": "IT_Plus d'informations ici :", "Only the poll maker can see the poll's results": "Solo il creatore sondaggio possono vedere i risultati", "Optional parameters": "Parametri opzionali", diff --git a/locale/nl.json b/locale/nl.json index df17907..cc32c34 100644 --- a/locale/nl.json +++ b/locale/nl.json @@ -122,6 +122,7 @@ "Enter a name and a comment!": "Vul een naam en een opmerking in!", "Enter a title": "Voer een titel in", "Enter an email address": "Voer een emailadres in", + "Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: value must be an integer greater than 0", "Error!": "Fout!", "Failed to delete all comments": "Failed to delete all comments", "Failed to delete all votes": "Failed to delete all votes", @@ -142,6 +143,8 @@ "Poll id already used": "Deze ID is reeds gebruikt", "Something is going wrong...": "Er is iets foutgegaan...", "Something is wrong with the format": "Er is iets foutgegaan met het formaat", + "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized urls should only consist of alphanumeric characters and hyphens.", + "Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "Het adres is niet juist! Je moet een geldig emailadres invoeren (zoals r.stallman@outlock.com) zodat je de link naar je poll kan ontvangen.", "The column already exists": "De kolom bestaat reeds", "The name is invalid.": "De naam is niet geldig.", @@ -269,6 +272,7 @@ "Chart": "Grafiek", "Display the chart of the results": "Toon de grafiek met resultaten", "Edit the line: %s": "Bewerk regel: %s", + "Link to edit this particular line": "Link to edit this particular line", "Remove the line:": "Verwijder regel:", "Save the choices": "Keuzes opslaan", "Scroll to the left": "Scroll naar links", diff --git a/locale/oc.json b/locale/oc.json index 1bb797c..6b59c48 100644 --- a/locale/oc.json +++ b/locale/oc.json @@ -122,6 +122,7 @@ "Enter a name and a comment!": "Mercé de garnir los dos camps !", "Enter a title": "Cal picar un títol !", "Enter an email address": "Cal picar una adreça de messatjariá !", + "Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: value must be an integer greater than 0", "Error!": "Error !", "Failed to delete all comments": "Fracàs de la supression de totes los comentaris", "Failed to delete all votes": "Fracàs de la supression de totes los vòtes", @@ -142,6 +143,8 @@ "Poll id already used": "L’identificant es ja utilizat", "Something is going wrong...": "I a quicòm que truca...", "Something is wrong with the format": "I a quicòm que truca amb lo format.", + "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized urls should only consist of alphanumeric characters and hyphens.", + "Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after", "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "L’adreça picada es pas corrècta ! Cal una adreça valida (per exemple r.stallman@outlock.com) per recebre lo ligam cap al sondatge.", "The column already exists": "La colomna existís ja", "The name is invalid.": "Lo nom es pas valid.", @@ -269,6 +272,7 @@ "Chart": "Grafic", "Display the chart of the results": "Afichar lo grafic dels resultats", "Edit the line: %s": "Modificar la linha : %s", + "Link to edit this particular line": "Link to edit this particular line", "Remove the line:": "Suprimir la linha :", "Save the choices": "Enregistrar las causidas", "Scroll to the left": "Far desfilar a man esquèrra", From 0151361cc9b5ae5bf43f90fabef23fac0e1d2bfe Mon Sep 17 00:00:00 2001 From: Luc Didry Date: Thu, 5 Apr 2018 10:46:55 +0200 Subject: [PATCH 11/19] [i18n] Add check-trad job + pull locales when deploying to beta --- .gitlab-ci.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 392ebb7..a099e3c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,6 +17,18 @@ test: paths: - vendor/ +check-trad: + stage: test + allow_failure: true + script: + - if [ -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then echo "*** Unable to check if translations need to be pulled, exiting ***"; exit 1; fi + - export ORIG=$(git diff-files --shortstat) + - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi + - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make push-locales; fi + - git status > /dev/null 2>&1 + - export CHANGES=$(git diff-files --shortstat) + - if [[ $CHANGES != $ORIG ]]; then echo "*** There is changes in locales ***"; echo "*** You need to do `make pull-locales` in your repo ***"; exit 1; fi + # Create artifacts on master pages: stage: deploy @@ -45,6 +57,8 @@ beta: - git checkout develop - composer install -o --no-interaction --no-progress --prefer-dist --no-dev - composer dump-autoload --optimize --no-dev --classmap-authoritative + - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi + - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make pull-locales; fi - mkdir tpl_c - mkdir .public - cp -r * .public From c79b32984dcf1e12e74cec9b57ddfca1c4821b3a Mon Sep 17 00:00:00 2001 From: m Date: Thu, 5 Apr 2018 17:34:43 +0200 Subject: [PATCH 12/19] bug/undefined-offset-on-best-choices --- adminstuds.php | 2 +- .../Framadate/Services/PollService.php | 57 ++++++++++++++----- studs.php | 2 +- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/adminstuds.php b/adminstuds.php index 356f815..ab2cacd 100644 --- a/adminstuds.php +++ b/adminstuds.php @@ -435,7 +435,7 @@ $smarty->assign('deletion_date', strtotime($poll->end_date) + PURGE_DELAY * 8640 $smarty->assign('slots', $poll->format === 'D' ? $pollService->splitSlots($slots) : $slots); $smarty->assign('slots_hash', $pollService->hashSlots($slots)); $smarty->assign('votes', $pollService->splitVotes($votes)); -$smarty->assign('best_choices', $pollService->computeBestChoices($votes)); +$smarty->assign('best_choices', $pollService->computeBestChoices($votes, $poll)); $smarty->assign('comments', $comments); $smarty->assign('editingVoteId', $editingVoteId); $smarty->assign('message', $message); diff --git a/app/classes/Framadate/Services/PollService.php b/app/classes/Framadate/Services/PollService.php index 104c6f6..05e326c 100644 --- a/app/classes/Framadate/Services/PollService.php +++ b/app/classes/Framadate/Services/PollService.php @@ -178,20 +178,49 @@ class PollService { return $this->pollRepository->findAllByAdminMail($mail); } - function computeBestChoices($votes) { - $result = ['y' => [0], 'inb' => [0]]; - foreach ($votes as $vote) { - $choices = str_split($vote->choices); - foreach ($choices as $i => $choice) { - if (!isset($result['y'][$i])) { - $result['inb'][$i] = 0; - $result['y'][$i] = 0; + function computeBestChoices($votes, $poll) { + $result = ['y' => [], 'inb' => []]; + + if (0 === count($votes)) { + // if there is no votes, calculates the number of slot + + $slots = $this->allSlotsByPoll($poll); + + if ($poll->format === 'A') { + // poll format classic + + foreach ($slots as $slot) { + $result['y'][] = 0; + $result['inb'][] = 0; } - if ($choice === "1") { - $result['inb'][$i]++; + } else { + // poll format date + + $slots = $this->splitSlots($slots); + + foreach ($slots as $slot) { + foreach ($slot->moments as $_) { + $result['y'][] = 0; + $result['inb'][] = 0; + } } - if ($choice === "2") { - $result['y'][$i]++; + } + } else { + // if there is votes + + foreach ($votes as $vote) { + $choices = str_split($vote->choices); + foreach ($choices as $i => $choice) { + if (!isset($result['y'][$i])) { + $result['inb'][$i] = 0; + $result['y'][$i] = 0; + } + if ($choice === "1") { + $result['inb'][$i]++; + } + if ($choice === "2") { + $result['y'][$i]++; + } } } } @@ -293,10 +322,10 @@ class PollService { if (count($votes) <= 0) { return; } - $best_choices = $this->computeBestChoices($votes); + $best_choices = $this->computeBestChoices($votes, $poll); foreach ($best_choices['y'] as $i => $nb_choice) { // if for this option we have reached maximum value and user wants to add itself too - if ($poll->ValueMax !== null && $nb_choice >= $poll->ValueMax && $user_choice[$i] === "2") { + if ($poll->ValueMax !== null && $nb_choice >= $poll->ValueMax && $user_choice[$i] === "2") { throw new ConcurrentVoteException(); } } diff --git a/studs.php b/studs.php index f202c4a..6cef3ee 100644 --- a/studs.php +++ b/studs.php @@ -227,7 +227,7 @@ $smarty->assign('deletion_date', strtotime($poll->end_date) + PURGE_DELAY * 8640 $smarty->assign('slots', $poll->format === 'D' ? $pollService->splitSlots($slots) : $slots); $smarty->assign('slots_hash', $pollService->hashSlots($slots)); $smarty->assign('votes', $pollService->splitVotes($votes)); -$smarty->assign('best_choices', $pollService->computeBestChoices($votes)); +$smarty->assign('best_choices', $pollService->computeBestChoices($votes, $poll)); $smarty->assign('comments', $comments); $smarty->assign('editingVoteId', $editingVoteId); $smarty->assign('message', $message); From 61ac8fcf764935c0d4f7c5db3f0dba5edc95b3bd Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 6 Apr 2018 09:40:53 +0200 Subject: [PATCH 13/19] Refactor a bit Also fix utf8 issue on licence file Signed-off-by: Thomas Citharel --- .../Repositories/RepositoryFactory.php | 6 +- .../Framadate/Services/PollService.php | 92 +++++++++++-------- 2 files changed, 56 insertions(+), 42 deletions(-) diff --git a/app/classes/Framadate/Repositories/RepositoryFactory.php b/app/classes/Framadate/Repositories/RepositoryFactory.php index 1ebef18..810d391 100644 --- a/app/classes/Framadate/Repositories/RepositoryFactory.php +++ b/app/classes/Framadate/Repositories/RepositoryFactory.php @@ -4,16 +4,16 @@ * is not distributed with this file, you can obtain one at * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt * - * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ + * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ * Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft) * * ============================= * - * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence + * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence * ne se trouve pas avec ce fichier vous pouvez l'obtenir sur * http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt * - * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ + * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft) */ namespace Framadate\Repositories; diff --git a/app/classes/Framadate/Services/PollService.php b/app/classes/Framadate/Services/PollService.php index 05e326c..a01e683 100644 --- a/app/classes/Framadate/Services/PollService.php +++ b/app/classes/Framadate/Services/PollService.php @@ -25,7 +25,6 @@ use Framadate\Form; use Framadate\FramaDB; use Framadate\Repositories\RepositoryFactory; use Framadate\Security\Token; -use Framadate\Utils; class PollService { private $connect; @@ -178,49 +177,64 @@ class PollService { return $this->pollRepository->findAllByAdminMail($mail); } - function computeBestChoices($votes, $poll) { + /** + * @param \stdClass $poll + * @return array + */ + private function computeEmptyBestChoices($poll) + { $result = ['y' => [], 'inb' => []]; - - if (0 === count($votes)) { - // if there is no votes, calculates the number of slot - - $slots = $this->allSlotsByPoll($poll); - - if ($poll->format === 'A') { - // poll format classic - - foreach ($slots as $slot) { + // if there is no votes, calculates the number of slot + + $slots = $this->allSlotsByPoll($poll); + + if ($poll->format === 'A') { + // poll format classic + + for ($i = 0; $i < count($slots); $i++) { + $result['y'][] = 0; + $result['inb'][] = 0; + } + } else { + // poll format date + + $slots = $this->splitSlots($slots); + + foreach ($slots as $slot) { + for ($i = 0; $i < count($slot->moments); $i++) { $result['y'][] = 0; $result['inb'][] = 0; } - } else { - // poll format date - - $slots = $this->splitSlots($slots); - - foreach ($slots as $slot) { - foreach ($slot->moments as $_) { - $result['y'][] = 0; - $result['inb'][] = 0; - } - } } - } else { - // if there is votes - - foreach ($votes as $vote) { - $choices = str_split($vote->choices); - foreach ($choices as $i => $choice) { - if (!isset($result['y'][$i])) { - $result['inb'][$i] = 0; - $result['y'][$i] = 0; - } - if ($choice === "1") { - $result['inb'][$i]++; - } - if ($choice === "2") { - $result['y'][$i]++; - } + } + return $result; + } + + /** + * @param array $votes + * @param \stdClass $poll + * @return array + */ + public function computeBestChoices($votes, $poll) { + + if (0 === count($votes)) { + return $this->computeEmptyBestChoices($poll); + } + $result = ['y' => [], 'inb' => []]; + + // if there are votes + foreach ($votes as $vote) { + $choices = str_split($vote->choices); + foreach ($choices as $i => $choice) { + if (!isset($result['y'][$i])) { + $result['inb'][$i] = 0; + $result['y'][$i] = 0; + } + if ($choice === "1") { + $result['inb'][$i]++; + } + if ($choice === "2") { + $result['y'][$i]++; } } } From 08f7ca141d3f7f054dccba1e86b9f4d94f316e82 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 6 Apr 2018 09:43:32 +0200 Subject: [PATCH 14/19] CS Signed-off-by: Thomas Citharel --- .../Framadate/Services/PollService.php | 67 +++++++++---------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/app/classes/Framadate/Services/PollService.php b/app/classes/Framadate/Services/PollService.php index a01e683..ad180b1 100644 --- a/app/classes/Framadate/Services/PollService.php +++ b/app/classes/Framadate/Services/PollService.php @@ -177,46 +177,12 @@ class PollService { return $this->pollRepository->findAllByAdminMail($mail); } - /** - * @param \stdClass $poll - * @return array - */ - private function computeEmptyBestChoices($poll) - { - $result = ['y' => [], 'inb' => []]; - // if there is no votes, calculates the number of slot - - $slots = $this->allSlotsByPoll($poll); - - if ($poll->format === 'A') { - // poll format classic - - for ($i = 0; $i < count($slots); $i++) { - $result['y'][] = 0; - $result['inb'][] = 0; - } - } else { - // poll format date - - $slots = $this->splitSlots($slots); - - foreach ($slots as $slot) { - for ($i = 0; $i < count($slot->moments); $i++) { - $result['y'][] = 0; - $result['inb'][] = 0; - } - } - } - return $result; - } - /** * @param array $votes * @param \stdClass $poll * @return array */ public function computeBestChoices($votes, $poll) { - if (0 === count($votes)) { return $this->computeEmptyBestChoices($poll); } @@ -305,6 +271,39 @@ class PollService { return $slots; } + /** + * @param \stdClass $poll + * @return array + */ + private function computeEmptyBestChoices($poll) + { + $result = ['y' => [], 'inb' => []]; + // if there is no votes, calculates the number of slot + + $slots = $this->allSlotsByPoll($poll); + + if ($poll->format === 'A') { + // poll format classic + + for ($i = 0; $i < count($slots); $i++) { + $result['y'][] = 0; + $result['inb'][] = 0; + } + } else { + // poll format date + + $slots = $this->splitSlots($slots); + + foreach ($slots as $slot) { + for ($i = 0; $i < count($slot->moments); $i++) { + $result['y'][] = 0; + $result['inb'][] = 0; + } + } + } + return $result; + } + private function random($length) { return Token::getToken($length); } From 2c3dfa8f5951e430de80ad91aae51e8e0acc23e6 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 6 Apr 2018 09:46:30 +0200 Subject: [PATCH 15/19] Improve tests a bit Signed-off-by: Thomas Citharel --- app/tests/Framadate/FramaTestCase.php | 4 ++- .../Services/InputServiceUnitTest.php | 35 +++++++++---------- .../Services/MailServiceUnitTest.php | 10 ++---- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/app/tests/Framadate/FramaTestCase.php b/app/tests/Framadate/FramaTestCase.php index eba5b69..6210a31 100644 --- a/app/tests/Framadate/FramaTestCase.php +++ b/app/tests/Framadate/FramaTestCase.php @@ -1,7 +1,9 @@ ["example@example.com", "example@example.com"], + "local address" => ["test@localhost", "test@localhost"], + "IP address" => ["ip.email@127.0.0.1", "ip.email@127.0.0.1"], + "with spaces arround" => [" with@spaces ", "with@spaces"], + "unicode caracters" => ["unicode.éà@idn-Å“.com", "unicode.éà@idn-Å“.com"], + // invalids addresses + "without domain" => ["without-domain", FALSE], + "space inside" => ["example example@example.com", FALSE], + "forbidden chars" => ["special_chars.@example.com", FALSE], + ]; + } + /** - * @test * @dataProvider liste_emails */ - function test_filterMail($email, $expected) { + public function test_filterMail($email, $expected) { $inputService = new InputService(); $filtered = $inputService->filterMail($email); - + $this->assertSame($expected, $filtered); } - - function liste_emails() { - return [ - // valids addresses - "valid address" => ["example@example.com", "example@example.com"], - "local address" => ["test@localhost", "test@localhost"], - "IP address" => ["ip.email@127.0.0.1", "ip.email@127.0.0.1"], - "with spaces arround" => [" with@spaces ", "with@spaces"], - "unicode caracters" => ["unicode.éà@idn-Å“.com", "unicode.éà@idn-Å“.com"], - // invalids addresses - "without domain" => ["without-domain", FALSE], - "space inside" => ["example example@example.com", FALSE], - "forbidden chars" => ["special_chars.@example.com", FALSE], - ]; - } } diff --git a/app/tests/Framadate/Services/MailServiceUnitTest.php b/app/tests/Framadate/Services/MailServiceUnitTest.php index 0ffdb39..f70e687 100644 --- a/app/tests/Framadate/Services/MailServiceUnitTest.php +++ b/app/tests/Framadate/Services/MailServiceUnitTest.php @@ -6,10 +6,7 @@ use Framadate\FramaTestCase; class MailServiceUnitTest extends FramaTestCase { const MSG_KEY = '666'; - /** - * @test - */ - function should_send_a_2nd_mail_after_a_good_interval() { + public function test_should_send_a_2nd_mail_after_a_good_interval() { // Given $mailService = new MailService(true); $_SESSION[MailService::MAILSERVICE_KEY] = [self::MSG_KEY => time() - 1000]; @@ -21,10 +18,7 @@ class MailServiceUnitTest extends FramaTestCase { $this->assertSame(true, $canSendMsg); } - /** - * @test - */ - function should_not_send_2_mails_in_a_short_interval() { + public function test_should_not_send_2_mails_in_a_short_interval() { // Given $mailService = new MailService(true); $_SESSION[MailService::MAILSERVICE_KEY] = [self::MSG_KEY => time()]; From e6f6df5eb64fdeef774c666ffc6bde047013ab0c Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 6 Apr 2018 09:53:50 +0200 Subject: [PATCH 16/19] Version 1.1.0-beta.3 Signed-off-by: Thomas Citharel --- app/inc/constants.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/inc/constants.php b/app/inc/constants.php index 6f59177..44dd6ef 100644 --- a/app/inc/constants.php +++ b/app/inc/constants.php @@ -18,7 +18,7 @@ */ // FRAMADATE version -const VERSION = '1.1.0-alpha.1'; +const VERSION = '1.1.0-beta.3'; // PHP Needed version const PHP_NEEDED_VERSION = '5.6'; From a4ad96c78f184366f7f92f296d68972ad33f7054 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 6 Apr 2018 10:06:34 +0200 Subject: [PATCH 17/19] Put correct rights on produced zip Signed-off-by: Thomas Citharel --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a099e3c..0e76b5d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -40,6 +40,7 @@ pages: - mkdir tpl_c - mkdir framadate - mv `ls -A | grep -v framadate` ./framadate + - chmod -R 644 framadate/ && chmod -R 770 framadate/tpl_c/ && chmod -R 770 framadate/app/inc/ - zip -r latest.zip framadate - mkdir .public - cp latest.zip .public From 2cf458960e6e4c69d02119265f1514cb1c162c0d Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 6 Apr 2018 11:44:11 +0200 Subject: [PATCH 18/19] Improve the vote link reminder function Move the link to a clickable button that copies the link inside the clipboard, and triggers a 2 sec popover to tell it to the user If the clipboard API fails, the user should be redirected directly to the link Signed-off-by: Thomas Citharel --- js/app/adminstuds.js | 57 ++++++++++++++++++++++++++++++++- js/app/studs.js | 3 +- js/jquery-ui.min.js | 13 -------- locale/en.json | 1 + locale/fr.json | 1 + locale/fr_FR.json | 1 + tpl/part/vote_table_classic.tpl | 9 +++--- tpl/part/vote_table_date.tpl | 9 +++--- tpl/studs.tpl | 1 - 9 files changed, 69 insertions(+), 26 deletions(-) delete mode 100644 js/jquery-ui.min.js diff --git a/js/app/adminstuds.js b/js/app/adminstuds.js index c77d06f..fadda2a 100644 --- a/js/app/adminstuds.js +++ b/js/app/adminstuds.js @@ -2,7 +2,62 @@ $(document).ready(function() { wrapper = new MDEWrapper($('.js-desc textarea')[0], $('#rich-editor-button'), $('#simple-editor-button')); var firstOpening = true; + $('[data-toggle="popover"]').popover(); + function createNode(text) { + var node = document.createElement('pre'); + node.style.width = '1px'; + node.style.height = '1px'; + node.style.position = 'fixed'; + node.style.top = '5px'; + node.textContent = text; + return node; + } + + function copyNode(node) { + var selection = getSelection(); + selection.removeAllRanges(); + + var range = document.createRange(); + range.selectNodeContents(node); + selection.addRange(range); + + document.execCommand('copy'); + selection.removeAllRanges(); + } + + function copyText(text) { + var node = createNode(text); + document.body.appendChild(node); + copyNode(node); + document.body.removeChild(node); + } + + /** + * When clicked on a .clipboard-url link, copy link inside clipboard and show popover confirmation for 2 seconds + */ + $('body').on('click', '.clipboard-url', function(e) { + var btn = $(e.target); + /** + * Kind of workaround for clicking child instead of button (because propagation is stopped with preventDefault()) + */ + if (!btn.get(0).hasAttribute('data-toggle')) { + btn = btn.parent(); + } + /** + * Try catch because reasons : https://caniuse.com/#feat=clipboard + */ + try { + copyText(btn.attr('href')); + btn.popover('show'); + setTimeout(function () { + btn.popover('hide'); + }, 2000); + e.preventDefault(); + } catch (err) { + console.log('Oops, unable to copy'); + } + }); $('#title-form .btn-edit').on('click', function() { $('#title-form h3').hide(); @@ -140,4 +195,4 @@ $(document).ready(function() { }); -}); \ No newline at end of file +}); diff --git a/js/app/studs.js b/js/app/studs.js index 7ebef8c..3322faf 100644 --- a/js/app/studs.js +++ b/js/app/studs.js @@ -75,7 +75,8 @@ $(document).ready(function () { var lastComment = $('#comments_list') .find('div.comment') .last(); - lastComment.effect('highlight', {color: 'green'}, 401); + // TODO : replace old jQuery UI Effect with Modern CSS + // lastComment.effect('highlight', {color: 'green'}, 401); $('html, body').animate({ scrollTop: lastComment.offset().top }, 750); diff --git a/js/jquery-ui.min.js b/js/jquery-ui.min.js deleted file mode 100644 index 25398a1..0000000 --- a/js/jquery-ui.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/*! jQuery UI - v1.12.1 - 2016-09-14 -* http://jqueryui.com -* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js -* Copyright jQuery Foundation and other contributors; Licensed MIT */ - -(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function s(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=n(t("
"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(m.inline?m.dpDiv.parent()[0]:m.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=l.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("

")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(p),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(p.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(d)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(c+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(c+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(u,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(u)||"",t.removeData(u)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(d),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(d,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?l?this[l](s.duration,h):this.each(function(){h&&h.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n) -}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("
").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var f=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=h?2*u:u/2;h&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=a-(d-1)/2,p.clone().appendTo("body").wrap("
").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,h=2*r+1,l=Math.round(e.duration/h),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var f;t.uiBackCompat!==!1&&(f=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,.\/:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=h.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n; -this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("