Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/passman.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPassman Bot <info@passman.cc>2017-01-16 15:39:42 +0300
committerPassman Bot <info@passman.cc>2017-01-16 15:39:42 +0300
commit2fae103964b3f58cfa0ae9451cdb76a62be5c9d3 (patch)
tree0ec204613da2def2656989923b209f3d72e37bc9
parentdfaac9d34cb60e05153b10a3779d44e44754105d (diff)
Passman 2.0.0-RC42.0.0-RC4
Merge branch 'customFieldPasswordFix' Signed-off-by: Passman Bot <info@passman.cc>
-rw-r--r--README.md18
-rw-r--r--appinfo/info.xml9
-rw-r--r--appinfo/routes.php3
-rw-r--r--controller/credentialcontroller.php46
-rw-r--r--controller/filecontroller.php3
-rw-r--r--controller/sharecontroller.php21
-rw-r--r--controller/translationcontroller.php10
-rw-r--r--controller/vaultcontroller.php35
-rw-r--r--css/passman.min.css2
-rw-r--r--docs/api.md157
-rw-r--r--js/passman.min.js15
-rw-r--r--l10n/cs_CZ.js243
-rw-r--r--l10n/cs_CZ.json243
-rw-r--r--l10n/de.js8
-rw-r--r--l10n/de.json8
-rw-r--r--l10n/de_DE.js8
-rw-r--r--l10n/de_DE.json8
-rw-r--r--l10n/es.js24
-rw-r--r--l10n/es.json24
-rw-r--r--l10n/fr.js28
-rw-r--r--l10n/fr.json28
-rw-r--r--l10n/it.js3
-rw-r--r--l10n/it.json3
-rw-r--r--l10n/nl.js8
-rw-r--r--l10n/nl.json8
-rw-r--r--l10n/pt_BR.js8
-rw-r--r--l10n/pt_BR.json8
-rw-r--r--l10n/ru.js8
-rw-r--r--l10n/ru.json8
-rw-r--r--l10n/sv.js275
-rw-r--r--l10n/sv.json273
-rw-r--r--lib/Db/CredentialMapper.php73
-rw-r--r--lib/Db/VaultMapper.php8
-rw-r--r--lib/Service/CredentialRevisionService.php36
-rw-r--r--lib/Service/CredentialService.php82
-rw-r--r--lib/Service/EncryptService.php399
-rw-r--r--lib/Service/FileService.php29
-rw-r--r--lib/Service/SettingsService.php2
-rw-r--r--lib/Service/ShareService.php93
-rw-r--r--lib/Service/VaultService.php13
-rw-r--r--migration/serversideencryption.php127
-rw-r--r--templates/main.php8
-rw-r--r--templates/part.admin.php17
43 files changed, 2238 insertions, 192 deletions
diff --git a/README.md b/README.md
index c4bc83aa..8a577a28 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,9 @@
#Passman
[![Build Status](https://travis-ci.org/nextcloud/passman.svg?branch=master)](https://travis-ci.org/nextcloud/passman)
+[![Codacy Badge](https://api.codacy.com/project/badge/Grade/749bb288c9fd4592a73056549d44a85e)](https://www.codacy.com/app/brantje/passman?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nextcloud/passman&amp;utm_campaign=Badge_Grade)
+[![Codacy Badge](https://api.codacy.com/project/badge/Coverage/749bb288c9fd4592a73056549d44a85e)](https://www.codacy.com/app/brantje/passman?utm_source=github.com&utm_medium=referral&utm_content=nextcloud/passman&utm_campaign=Badge_Coverage)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/nextcloud/passman/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/nextcloud/passman/?branch=master)
-[![Code Coverage](https://scrutinizer-ci.com/g/nextcloud/passman/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/nextcloud/passman/?branch=master)
Passman is a full featured password manager.
@@ -29,6 +30,11 @@ For a demo of this app visit [https://demo.passman.cc](https://demo.passman.cc)
- NextCloud 10 / 11
- ownCloud 9.1+
+## Browser extensions
+At this moment we don't have any extensions available, sorry!
+However, if you're interested in helping us (or you want to guide us while building)
+Check out: https://github.com/nextcloud/passman-chrome-extension
+
## Supported databases
- SQL Lite*
@@ -51,6 +57,16 @@ Untested databases:
For more screenshots: [Click here](http://imgur.com/a/giKVt)
+## Encryption (server side)
+All passwords are encrypted client side AND server side.
+This means that if you move to another server you have to backup the following from config.php
+- `passwordsalt`
+- `secret`
+
+## Support Passman
+If you like passman, support us via [patreon](https://www.patreon.com/user?u=4833592) or [paypal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6YS8F97PETVU2)
+
+
## Code reviews
If you have any improvements regarding our code.
Please do the following
diff --git a/appinfo/info.xml b/appinfo/info.xml
index f700dc9f..45f03643 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -17,7 +17,7 @@ For an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc)
]]></description>
<licence>AGPL</licence>
- <version>2.0.0-RC3</version>
+ <version>2.0.0-RC4</version>
<author homepage="https://github.com/brantje">Sander Brand</author>
<author homepage="https://github.com/animalillo">Marcos Zuriaga</author>
<namespace>Passman</namespace>
@@ -39,8 +39,15 @@ For an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc)
<nextcloud min-version="9" max-version="12" />
<database>sqlite</database>
<database min-version="5.5">mysql</database>
+ <lib>openssl</lib>
</dependencies>
+ <repair-steps>
+ <post-migration>
+ <step>OCA\Passman\Migration\ServerSideEncryption</step>
+ </post-migration>
+ </repair-steps>
+
<settings>
<admin>OCA\Passman\Controller\SettingsController</admin>
</settings>
diff --git a/appinfo/routes.php b/appinfo/routes.php
index 5413b79f..79afa309 100644
--- a/appinfo/routes.php
+++ b/appinfo/routes.php
@@ -76,6 +76,9 @@ return [
//Translations
['name' => 'translation#getLanguageStrings', 'url' => '/api/v2/language', 'verb' => 'GET'],
+ //
+ ['name' => 'vault#preflighted_cors', 'url' => '/api/v2/{path}', 'verb' => 'OPTIONS', 'requirements' => array('path' => '.+')],
+
//Internal API
['name' => 'internal#remind', 'url' => '/api/internal/notifications/remind/{credential_id}', 'verb' => 'POST'],
['name' => 'internal#read', 'url' => '/api/internal/notifications/read/{credential_id}', 'verb' => 'DELETE'],
diff --git a/controller/credentialcontroller.php b/controller/credentialcontroller.php
index 3c6dd6b5..554755e7 100644
--- a/controller/credentialcontroller.php
+++ b/controller/credentialcontroller.php
@@ -11,9 +11,12 @@
namespace OCA\Passman\Controller;
+use OCA\Passman\Db\Credential;
use OCA\Passman\Db\SharingACL;
+use OCA\Passman\Service\EncryptService;
use OCA\Passman\Service\SettingsService;
use OCA\Passman\Utility\NotFoundJSONResponse;
+use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\IRequest;
@@ -42,6 +45,7 @@ class CredentialController extends ApiController {
CredentialRevisionService $credentialRevisionService,
ShareService $sharingService,
SettingsService $settings
+
) {
parent::__construct($AppName, $request);
$this->userId = $userId;
@@ -86,6 +90,7 @@ class CredentialController extends ApiController {
'hidden' => $hidden,
);
+
$credential = $this->credentialService->createCredential($credential);
$link = ''; // @TODO create direct link to credential
if (!$credential->getHidden()) {
@@ -102,7 +107,8 @@ class CredentialController extends ApiController {
* @NoCSRFRequired
*/
public function getCredential($credential_guid) {
- return new JSONResponse($this->credentialService->getCredentialByGUID($credential_guid, $this->userId));
+ $credential = $this->credentialService->getCredentialByGUID($credential_guid, $this->userId);
+ return new JSONResponse($credential);
}
/**
@@ -116,7 +122,7 @@ class CredentialController extends ApiController {
$tags, $url, $username, $vault_id, $revision_created, $shared_key, $acl, $unshare_action, $set_share_key, $skip_revision) {
- $storedCredential = $this->credentialService->getCredentialByGUID($credential_guid, $this->userId);
+ $storedCredential = $this->credentialService->getCredentialByGUID($credential_guid);
$credential = array(
'credential_id' => $credential_id,
@@ -139,6 +145,7 @@ class CredentialController extends ApiController {
'delete_time' => $delete_time,
'hidden' => $hidden,
'otp' => $otp,
+ 'user_id' => $storedCredential->getUserId()
);
@@ -149,11 +156,12 @@ class CredentialController extends ApiController {
} else {
return new DataResponse(['msg' => 'Not authorized'], Http::STATUS_UNAUTHORIZED);
}
- if ($this->settings->isEnabled('user_sharing_enabled')) {
+ if (!$this->settings->isEnabled('user_sharing_enabled')) {
return new DataResponse(['msg' => 'Not authorized'], Http::STATUS_UNAUTHORIZED);
}
}
+
$link = ''; // @TODO create direct link to credential
if ($revision_created) {
$activity = 'item_apply_revision';
@@ -234,9 +242,15 @@ class CredentialController extends ApiController {
$storedCredential->setSharedKey('');
$credential['shared_key'] = '';
}
+
+ if (!isset($credential['shared_key'])) {
+ $credential['shared_key'] = $storedCredential->getSharedKey();
+ }
+
if (!$skip_revision) {
$this->credentialRevisionService->createRevision($storedCredential, $storedCredential->getUserId(), $credential_id, $this->userId);
}
+
$credential = $this->credentialService->updateCredential($credential);
return new JSONResponse($credential);
@@ -247,19 +261,34 @@ class CredentialController extends ApiController {
* @NoCSRFRequired
*/
public function deleteCredential($credential_guid) {
- $credential = $this->credentialService->getCredentialByGUID($credential_guid, $this->userId);
+ try {
+ $credential = $this->credentialService->getCredentialByGUID($credential_guid, $this->userId);
+ } catch (\Exception $e) {
+ return new NotFoundJSONResponse();
+ }
if ($credential) {
$result = $this->credentialService->deleteCredential($credential);
- $this->activityService->add(
- 'item_destroyed_self', array($credential->getLabel()),
- '', array(),
- '', $this->userId, Activity::TYPE_ITEM_ACTION);
+ $this->deleteCredentialParts($credential);
} else {
$result = false;
}
return new JSONResponse($result);
}
+ /**
+ * Delete leftovers from a credential
+ * @param Credential $credential
+ */
+ private function deleteCredentialParts(Credential $credential) {
+ $this->activityService->add(
+ 'item_destroyed_self', array($credential->getLabel()),
+ '', array(),
+ '', $this->userId, Activity::TYPE_ITEM_ACTION);
+ $this->sharingService->unshareCredential($credential->getGuid());
+ foreach ($this->credentialRevisionService->getRevisions($credential->getId()) as $revision) {
+ $this->credentialRevisionService->deleteRevision($revision->getId(), $this->userId);
+ }
+ }
/**
* @NoAdminRequired
@@ -271,7 +300,6 @@ class CredentialController extends ApiController {
} catch (\Exception $ex) {
return new NotFoundJSONResponse();
}
-
// If the request was made by the owner of the credential
if ($this->userId === $credential->getUserId()) {
$result = $this->credentialRevisionService->getRevisions($credential->getId(), $this->userId);
diff --git a/controller/filecontroller.php b/controller/filecontroller.php
index 368e1c87..7a025516 100644
--- a/controller/filecontroller.php
+++ b/controller/filecontroller.php
@@ -39,7 +39,8 @@ class FileController extends ApiController {
'filename' => $filename,
'size' => $size,
'mimetype' => $mimetype,
- 'file_data' => $data
+ 'file_data' => $data,
+ 'user_id' => $this->userId
);
return new JSONResponse($this->fileService->createFile($file, $this->userId));
}
diff --git a/controller/sharecontroller.php b/controller/sharecontroller.php
index 24d852a9..7c921b53 100644
--- a/controller/sharecontroller.php
+++ b/controller/sharecontroller.php
@@ -213,20 +213,7 @@ class ShareController extends ApiController {
* @NoCSRFRequired
*/
public function unshareCredential($item_guid) {
- $acl_list = $this->shareService->getCredentialAclList($item_guid);
- $request_list = $this->shareService->getShareRequestsByGuid($item_guid);
- foreach ($acl_list as $ACL) {
- $this->shareService->deleteShareACL($ACL);
- }
- foreach ($request_list as $request) {
- $this->shareService->deleteShareRequest($request);
- $manager = \OC::$server->getNotificationManager();
- $notification = $manager->createNotification();
- $notification->setApp('passman')
- ->setObject('passman_share_request', $request->getId())
- ->setUser($request->getTargetUserId());
- $manager->markProcessed($notification);
- }
+ $this->shareService->unshareCredential($item_guid);
return new JSONResponse(array('result' => true));
}
@@ -464,12 +451,12 @@ class ShareController extends ApiController {
}
/**
- * @param $credential_guid
+ * @param $item_guid
* @param $file_guid
* @NoAdminRequired
* @PublicPage
- * @return JSONResponse
- * @return NotFoundResponse
+ * @return mixed
+ * @return NotFoundJSONResponse
*/
public function getFile($item_guid, $file_guid) {
try {
diff --git a/controller/translationcontroller.php b/controller/translationcontroller.php
index a60e6abd..4bfcabf8 100644
--- a/controller/translationcontroller.php
+++ b/controller/translationcontroller.php
@@ -186,6 +186,12 @@ class TranslationController extends ApiController {
'bookmarklet' => $this->trans->t('Bookmarklet'),
'bookmarklet.info1' => $this->trans->t('Save your passwords with 1 click!'),
'bookmarklet.info2' => $this->trans->t('Drag below button to your bookmark toolbar.'),
+ 'delete.vault' => $this->trans->t('Delete vault'),
+ 'vault.password' => $this->trans->t('Vault password'),
+ 'vault.remove.notice' => $this->trans->t('This process is irreversible'),
+ 'delete.vault.checkbox' => $this->trans->t('Delete my precious passwords'),
+ 'deleting.pw' => $this->trans->t('Deleting {{password}}...'),
+ 'delete.vault.confirm' => $this->trans->t('Yes, delete my precious passwords'),
// templates/views/partials/forms/settings/import.html
@@ -304,7 +310,7 @@ class TranslationController extends ApiController {
'revisions' => $this->trans->t('Revisions'),
'recover' => $this->trans->t('Recover'),
'destroy' => $this->trans->t('Destroy'),
-
+ 'use.regex' => $this->trans->t('Use regex'),
'sharereq.title' => $this->trans->t('You have incoming share requests.'),
'sharereq.line1' => $this->trans->t('If you want to put the credential in a other vault,'),
'sharereq.line2' => $this->trans->t('logout of this vault and login to the vault you want the shared credential in.'),
@@ -313,6 +319,7 @@ class TranslationController extends ApiController {
'date' => $this->trans->t('Date'),
'accept' => $this->trans->t('Accept'),
'decline' => $this->trans->t('Decline'),
+ 'session.time.left' => $this->trans->t('You have {{session_time}} left before logout.'),
// templates/views/vaults.html
'last.access' => $this->trans->t('Last accessed'),
@@ -329,6 +336,7 @@ class TranslationController extends ApiController {
'input.vault.password' => $this->trans->t('Please input the password for'),
'vault.default' => $this->trans->t('Set this vault as default.'),
'vault.auto.login' => $this->trans->t('Login automatically to this vault.'),
+ 'auto.logout' => $this->trans->t('Logout of this vault automatically after: '),
'vault.decrypt' => $this->trans->t('Decrypt vault'),
// templates/bookmarklet.php
diff --git a/controller/vaultcontroller.php b/controller/vaultcontroller.php
index 93df13b2..8381dd63 100644
--- a/controller/vaultcontroller.php
+++ b/controller/vaultcontroller.php
@@ -11,6 +11,8 @@
namespace OCA\Passman\Controller;
+use OCA\Passman\Service\EncryptService;
+use OCA\Passman\Service\SettingsService;
use OCA\Passman\Utility\NotFoundJSONResponse;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\IRequest;
@@ -24,12 +26,14 @@ class VaultController extends ApiController {
private $userId;
private $vaultService;
private $credentialService;
+ private $settings;
public function __construct($AppName,
IRequest $request,
$UserId,
VaultService $vaultService,
- CredentialService $credentialService) {
+ CredentialService $credentialService,
+ SettingsService $settings) {
parent::__construct(
$AppName,
$request,
@@ -39,6 +43,7 @@ class VaultController extends ApiController {
$this->userId = $UserId;
$this->vaultService = $vaultService;
$this->credentialService = $credentialService;
+ $this->settings = $settings;
}
/**
@@ -50,19 +55,21 @@ class VaultController extends ApiController {
$vaults = $this->vaultService->getByUser($this->userId);
$protected_credential_fields = array('getDescription', 'getEmail', 'getUsername', 'getPassword');
- if ($vaults) {
+ if (isset($vaults)) {
foreach ($vaults as $vault) {
$credential = $this->credentialService->getRandomCredentialByVaultId($vault->getId(), $this->userId);
$secret_field = $protected_credential_fields[array_rand($protected_credential_fields)];
- array_push($result, array(
- 'vault_id' => $vault->getId(),
- 'guid' => $vault->getGuid(),
- 'name' => $vault->getName(),
- 'created' => $vault->getCreated(),
- 'public_sharing_key' => $vault->getPublicSharingKey(),
- 'last_access' => $vault->getlastAccess(),
- 'challenge_password' => $credential->{$secret_field}()
- ));
+ if(isset($credential)) {
+ array_push($result, array(
+ 'vault_id' => $vault->getId(),
+ 'guid' => $vault->getGuid(),
+ 'name' => $vault->getName(),
+ 'created' => $vault->getCreated(),
+ 'public_sharing_key' => $vault->getPublicSharingKey(),
+ 'last_access' => $vault->getlastAccess(),
+ 'challenge_password' => $credential->{$secret_field}(),
+ ));
+ }
}
}
@@ -83,7 +90,6 @@ class VaultController extends ApiController {
* @NoCSRFRequired
*/
public function get($vault_guid) {
- //$vault_guid
$vault = null;
try {
$vault = $this->vaultService->getByGuid($vault_guid, $this->userId);
@@ -91,7 +97,7 @@ class VaultController extends ApiController {
return new NotFoundJSONResponse();
}
$result = array();
- if ($vault) {
+ if (isset($vault)) {
$credentials = $this->credentialService->getCredentialsByVaultId($vault->getId(), $this->userId);
$result = array(
@@ -153,6 +159,7 @@ class VaultController extends ApiController {
* @NoCSRFRequired
*/
public function delete($vault_id) {
- return new JSONResponse($vault_id);
+ $this->vaultService->deleteVault($vault_id, $this->userId);
+ return new JSONResponse(array('ok' => true));
}
} \ No newline at end of file
diff --git a/css/passman.min.css b/css/passman.min.css
index ea6db121..fe8dc26d 100644
--- a/css/passman.min.css
+++ b/css/passman.min.css
@@ -27,4 +27,4 @@ Build date: 2016-09-06
*//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.row:after,.row:before{content:" ";display:table}.center-block{display:block;margin-left:auto;margin-right:auto}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.fa,.fa-stack{display:inline-block}/*!
* Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.eot?v=4.6.3);src:url(fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(fontawesome-webfont.woff?v=4.6.3) format('woff'),url(fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.pass-meter .details,.pass-meter .pass-meter-message{font-family:"Arial Black",Gadget,sans-serif;font-size:10px;line-height:10px;color:#555;min-height:7px}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.pass-meter{width:100%;padding-top:3px;padding-bottom:30px}.pass-meter.hidden{display:none}.pass-meter .details,.pass-meter .pass-meter-message{margin-top:3px}.pass-meter-col{float:left;width:25%;padding:1px}.pass-meter-col .indicator{border-radius:3px;background-color:#eee;height:5px}.pass-meter-col.poor .indicator{background-color:#ef4e3a}.pass-meter-col.weak .indicator{background-color:#F27B1C}.pass-meter-col.good .indicator{background-color:#6c3}.pass-meter-col.strong .indicator{background-color:#33A7E3}.pass-meter .pass-meter-message{width:49%;text-align:right;float:right}.pass-meter .details{width:49%;text-align:left;float:left;cursor:pointer}.pass-meter .details:hover,.pass-meter .link{color:#06f!important}.detail_box .row .col{float:left;width:49%}.match-sequence .sequence{float:left;width:auto;margin-right:10px}.match-sequence .sequence table td:nth-child(2){padding-left:4px}.sequence .token{text-align:center}.sequence code{border:1px solid;padding:3px}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{position:relative;margin-top:5px;margin-bottom:5px;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;color:#ececec}tags-input .tags .tag-item.selected{background:#ce3702!important}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags{background-color:#eee;cursor:default}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input[disabled] .tags .input{background-color:#eee;cursor:default}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.button-geen{background:#37ce02;color:#fff}.button-geen:hover{background:#3ad802;color:#fff}.button-red{background:#ce3702;color:#fff}.button-red:hover{background:#d83a02;color:#fff}.link{color:#06f!important;cursor:pointer}.tab_header{margin:44px 0 0;list-style:none;padding:0}.tab_header li.tab:first-child{margin-left:0}.tab_header li.tab{float:left;border-bottom-width:0;margin:0;padding:10px;cursor:pointer;border-right:1px solid #eee;-webkit-transition:background-color 250ms linear;-moz-transition:background-color 250ms linear;-o-transition:background-color 250ms linear;-ms-transition:background-color 250ms linear;transition:background-color 250ms linear}.tab_header li.tab .indicator{display:none}.tab_header li.active{color:#fff;position:relative}.tab_header li.active .indicator{display:inline-block;position:absolute;height:7px;left:0;right:0;bottom:-1px}.tab_container{border:1px solid;border-color:#eee;border-top-color:#0082c9;border-bottom:0;clear:both;padding:0 1em}.pw-gen{overflow:hidden}.pw-gen input{width:calc(100% - 80px)!important;float:left;background:#fff;color:#555;cursor:text;font-family:inherit;border:1px solid #ddd;outline:0;border-radius:3px;margin:3px 3px 3px 0;padding:7px 6px 5px;font-size:13px;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;background-clip:padding-box}.pw-gen .generate_pw{float:left;margin-top:3px;margin-left:-3px}.pw-gen .generate_pw .cell{padding:5px;display:inline-block;font-size:14px;border:1px solid #ddd;background-color:#eaeaea;cursor:pointer}.pw-gen .generate_pw .cell:hover{color:#06f}.pw-gen .generate_pw .cell:last-child{-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;background-clip:padding-box}.warning_bar{position:absolute;width:100%;padding:12px;font-weight:700;text-align:center;z-index:800;background-color:red;color:#fff}.warning_bar .fa-times{float:right;color:#000;cursor:pointer}.vault_wrapper{margin:0 auto;margin-top:20px;width:100%;max-width:420px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box;box-shadow:0 1px 1px #777;background:#eee;display:block}.vault_wrapper .vaultlist{z-index:500}.vault_wrapper .vaultlist div,.vault_wrapper .vaultlist li,.vault_wrapper .vaultlist small,.vault_wrapper .vaultlist span{cursor:pointer}.vault_wrapper .vaultlist small{color:#8e8e8e}.vault_wrapper .vaultlist li.selected{background-color:#0082c9!important;color:#ddd}.vault_wrapper .vaultlist li{border-bottom:1px solid #8e8e8e;padding:16px}.vault_wrapper .vaultlist li:hover{background-color:#f7f7f7}.vault_wrapper .login_form{padding:16px}.vault_wrapper .login_form .error{color:#ce3702}.vault_wrapper .login_form .pw-input .last_access{color:#8e8e8e}.vault_wrapper .login_form input[type=password],.vault_wrapper .login_form input[type=text]{width:100%;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box}.vault_wrapper .login_form .button_wrapper .button{width:45%;display:inline-block}.vault_wrapper .login_form .button{margin-top:10px}@media screen and (max-width:768px){.vault_wrapper{width:90%}}#app-content{overflow-x:hidden}#app-content #app-content-wrapper{min-height:95%}#app-content #app-content-wrapper #passman-controls{text-align:center;border-bottom:1px solid #c9c9c9}#app-content #app-content-wrapper #passman-controls.sidebar-shown{padding-right:27%!important}@media screen and (max-width:765px){#app-content #app-content-wrapper #passman-controls.sidebar-shown .title{display:none}}@media screen and (min-width:769px) and (max-width:1120px){#app-content #app-content-wrapper #passman-controls.sidebar-shown .title{display:none}}#app-content #app-content-wrapper .title{text-align:center;display:inline-block;font-weight:700;margin-top:10px}@media screen and (max-width:575px){#app-content #app-content-wrapper .title{display:none}}@media screen and (min-width:769px) and (max-width:820px){#app-content #app-content-wrapper .title{display:none}}#app-content #app-content-wrapper .actions.creatable{float:left;overflow:hidden}#app-content #app-content-wrapper .actions.creatable .bubble{position:relative;width:185px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box;box-shadow:0 1px 10px rgba(50,50,50,.7)}#app-content #app-content-wrapper .actions.creatable .bubble ul li{padding-left:10px}#app-content #app-content-wrapper .actions.creatable .bubble ul .menuitem{font-size:12px;display:inline}#app-content #app-content-wrapper .actions.creatable .bubble:after{right:inherit;left:10px;top:-19px}#app-content #app-content-wrapper .viewModes{float:right;margin-right:5px;margin-top:3px}#app-content #app-content-wrapper .viewModes .view-mode:first-child{-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;background-clip:padding-box;border:1px solid rgba(240,240,240,.9)}#app-content #app-content-wrapper .viewModes .view-mode:last-child{-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;background-clip:padding-box;border:1px solid rgba(240,240,240,.9)}#app-content #app-content-wrapper .viewModes .view-mode{background-color:rgba(240,240,240,.9);cursor:pointer;display:inline-block;padding:7px}#app-content #app-content-wrapper .viewModes .view-mode.active{display:inline-block;padding:7px;background-color:rgba(226,226,226,.9)}#app-content #app-content-wrapper .searchboxContainer{display:inline-block;margin-right:14px;float:right}#app-content #app-content-wrapper .searchboxContainer .searchbox{display:inline-block}#app-content #app-content-wrapper .searchboxContainer .searchclear{color:#ccc;cursor:pointer;font-size:18px;height:14px;margin:auto;position:absolute!important;right:10px;top:12px;z-index:99999999}#app-content #app-content-wrapper .searchboxContainer .searchOptions{position:relative;bottom:5px;background:#fff;border:1px solid #ddd;padding:5px;width:calc(100% - 3px);box-shadow:3px 3px 5px #888;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;background-clip:padding-box}#app-content #app-content-wrapper .credential-table{width:100%;margin-top:44px}#app-content #app-content-wrapper .credential-table tr:hover{background-color:#f5f5f5}#app-content #app-content-wrapper .credential-table tr.selected{background-color:#f8f8f8}#app-content #app-content-wrapper .credential-table tr td{cursor:pointer;padding:5px;border-bottom:1px solid #eee}#app-content #app-content-wrapper .credential-table tr td .icon{font-size:19px;float:left;margin-right:5px;margin-left:3px}#app-content #app-content-wrapper .credential-table tr td .icon-more{display:inline-block;float:right;margin-left:5px;margin-top:1px;opacity:.4;height:20px;width:32px;cursor:pointer}#app-content #app-content-wrapper .credential-table tr td .icon-more:hover{opacity:1}#app-content #app-content-wrapper .credential-table tr td .popovermenu{margin-top:25px;height:100px;width:100px;right:-2px!important;box-shadow:0 1px 10px rgba(50,50,50,.7)}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul{display:block;width:100px;height:75px}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul li{padding:0}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul .menuitem{font-size:12px;display:inline}#app-content #app-content-wrapper .credential-table tr td .popovermenu .action{padding:10px;margin:-10px}#app-content #app-content-wrapper .tags{float:right}#app-content #app-content-wrapper .edit_credential .password_settings label .label,#app-content #app-content-wrapper .edit_credential .tags{float:left}#app-content #app-content-wrapper .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;font-size:12px;margin-right:3px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box}#app-content #app-content-wrapper .tags .tag:last-child{margin-right:8px}#app-content #app-content-wrapper .grid-view{margin-top:44px;display:flex;flex-wrap:wrap}#app-content #app-content-wrapper .grid-view .credential{display:flex;width:100%;border:2px solid rgba(240,240,240,.9);margin:25px;-webkit-border-radius:10px;border-radius:10px;background-clip:padding-box}#app-content #app-content-wrapper .grid-view .credential .credential_content{display:flex;padding:2px;flex-direction:column;width:100%;cursor:pointer;font-size:1.75em;text-align:center}#app-content #app-content-wrapper .grid-view .credential .credential_content .label{padding-top:.5em;padding-left:1em;padding-right:1em;line-height:1.3em;word-wrap:break-word}#app-content #app-content-wrapper .grid-view .credential .credential_content .tags{margin-bottom:.5em}#app-content #app-content-wrapper .grid-view .credential .credential_content .tags .tag{color:#000!important;margin-top:5px;display:inline-block}@media all and (min-width:40em){#app-content #app-content-wrapper .grid-view .credential{width:40%}}@media all and (min-width:58em){#app-content #app-content-wrapper .grid-view .credential{width:26%}}@media all and (min-width:78em){#app-content #app-content-wrapper .grid-view .credential{width:20%}}#app-content #app-content-wrapper .edit_credential input[type=password],#app-content #app-content-wrapper .edit_credential input[type=text],#app-content #app-content-wrapper .edit_credential tags-input .tags{width:100%}#app-content #app-content-wrapper .edit_credential{padding-top:10px}#app-content #app-content-wrapper .edit_credential label{display:block}#app-content #app-content-wrapper .edit_credential .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;font-size:11px}#app-content #app-content-wrapper .edit_credential .credential_textarea{width:100%;height:100px}#app-content #app-content-wrapper .edit_credential .password_settings label{overflow:hidden}#app-content #app-content-wrapper .edit_credential .password_settings label input[type=checkbox]{width:auto!important;float:left}#app-content #app-content-wrapper .edit_credential .password_settings label .label.sm{font-size:12px}#app-content #app-content-wrapper .edit_credential .field-value .valueInput{padding-right:0}#app-content #app-content-wrapper .edit_credential .field-value .valueInput .pw-gen .generate_pw .cell:last-child,#app-content #app-content-wrapper .edit_credential .field-value .valueInput input{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;background-clip:padding-box}#app-content #app-content-wrapper .edit_credential .field-value .selectType{padding-left:0;margin-left:-4px}#app-content #app-content-wrapper .edit_credential .field-value .selectType select{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;background-clip:padding-box}#app-content #app-content-wrapper .edit_credential .custom_fields,#app-content #app-content-wrapper .edit_credential .files{margin-top:10px}#app-content #app-content-wrapper .edit_credential .custom_fields table,#app-content #app-content-wrapper .edit_credential .files table{width:100%}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th.dragger,#app-content #app-content-wrapper .edit_credential .files table thead th.dragger{width:3%}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th,#app-content #app-content-wrapper .edit_credential .files table thead th{color:#fff}.error,.shared_table .fa-trash:hover{color:#ce3702}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th.field_actions,#app-content #app-content-wrapper .edit_credential .files table thead th.field_actions{width:15%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr:hover,#app-content #app-content-wrapper .edit_credential .files table tr:hover{background-color:transparent}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.dragger,#app-content #app-content-wrapper .edit_credential .files table tr td.dragger{width:3%;text-align:center;cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.field_actions,#app-content #app-content-wrapper .edit_credential .files table tr td.field_actions{font-size:13px;width:15%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.field_actions i,#app-content #app-content-wrapper .edit_credential .files table tr td.field_actions i{cursor:pointer}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td,#app-content #app-content-wrapper .edit_credential .custom_fields table tr th,#app-content #app-content-wrapper .edit_credential .files table tr td,#app-content #app-content-wrapper .edit_credential .files table tr th{width:20%;padding:5px}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .custom_fields table tr th .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .files table tr td .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .files table tr th .editable-has-buttons.editable-input{width:55%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td,#app-content #app-content-wrapper .edit_credential .files table tr td{height:50px;vertical-align:middle}#app-content #app-content-wrapper .app_sidebar{padding:10px;overflow-y:auto}#app-content #app-content-wrapper .app_sidebar h2{margin-bottom:10px;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90%}#app-content #app-content-wrapper .app_sidebar .close.icon-close{position:absolute;top:10px;right:10px;cursor:pointer}#app-content #app-content-wrapper .app_sidebar.item_selected{height:25%;display:inline-block}#app-content #app-content-wrapper .app_sidebar .credential-data .row{margin-bottom:11px}#app-content #app-content-wrapper .app_sidebar .credential-data .tags{margin-top:15px;margin-bottom:15px;float:none}#app-content #app-content-wrapper .app_sidebar .credential-data .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;margin-right:3px}.credential_field .tools .cell,.inputfile+label{margin-right:4px;cursor:pointer}.credential_field{overflow:hidden}.credential_field .cell,.credential_field .value{float:left}.credential_field .value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:70%}.credential_field .tools{margin-left:10px;overflow:hidden;float:left}.progress{margin-top:10px;height:20px}.progress .progress-bar{position:relative;height:20px;background-image:none;background-color:#0082c9}.progress .progress-bar .progress-label{position:absolute;top:0;z-index:2;text-align:center;width:100%}.loaderContainer{height:140px;width:120px;margin-top:30px;margin-left:-60px;top:50%;left:50%;position:absolute}.loaderContainer .text{width:120px;text-align:center}.loader{border-bottom:10px solid #1d2d44;border-left:10px solid #c9c9c9;border-right:10px solid #c9c9c9;border-top:10px solid #c9c9c9;height:120px;width:120px;border-radius:120px;animation:1.1s linear 0s normal none infinite running load8}@keyframes load8{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.inputfile{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}#app-navigation li a tags-input,#app-navigation li a.taginput{opacity:1}.inputfile+label{font-size:1.25em;background-color:rgba(240,240,240,.9);margin-top:4px;padding:5px;border-right:1px solid #c9c9c9}.inputfile+label:hover,.inputfile:focus+label{background-color:#c9c9c9}.settings-container div{padding-left:15px}.nav-trashbin{position:fixed!important;bottom:44px;width:inherit!important;background-color:#fff;border-right:1px solid #eee}.nav-trashbin a{padding:0 20px}.nav-trashbin a .fa{margin-right:15px}#app-navigation li a{overflow:visible}#app-navigation li a tags-input li{width:auto!important}#app-navigation>ul ul{display:inherit!important}.sharing_table td:first-child{width:55%}.sharing_table td:first-child tags-input .tags,.table{width:100%}.sharing_table td:first-child .autocomplete{margin-top:35px}.share_credential{padding-top:10px}.share_credential input{width:auto}.share_credential>div{margin-bottom:10px}.shared_table .fa-trash{cursor:pointer}.scan-result-table{margin-top:10px}.scan-result-table .score{padding-left:0;padding-right:15px}.import_log{max-height:600px;overflow-y:auto}.import_log textarea{width:90%;height:200px}#app-settings-content:not(.ng-hide){height:60px;display:inherit!important;padding:0;transition:height .15s ease-out}#app-settings-content.ng-hide{display:inherit!important;height:0;padding:0;transition:height .15s ease-in}.ui-dialog{z-index:9999}#notification .row{margin-left:0!important;margin-right:0!important}#passman-controls{position:fixed;top:45px;right:0;left:0;padding:0!important;margin:0;background-color:rgba(255,255,255,.95);z-index:50;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:44px!important}@media only screen and (max-width:768px){#passman-controls{width:100%}}@media only screen and (min-width:768px){#app-navigation+#app-content #passman-controls{left:250px;width:calc(100% - 250px)!important}}#passman-controls,#passman-controls .button,#passman-controls input[type=submit],#passman-controls input[type=text],#passman-controls input[type=password],#passman-controls select{box-sizing:border-box;display:inline-block;height:36px;padding:7px 10px}.nopadding{padding-right:0;padding-left:0} \ No newline at end of file
+ */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.eot?v=4.6.3);src:url(fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(fontawesome-webfont.woff?v=4.6.3) format('woff'),url(fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.pass-meter .details,.pass-meter .pass-meter-message{font-family:"Arial Black",Gadget,sans-serif;font-size:10px;line-height:10px;color:#555;min-height:7px}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.pass-meter{width:100%;padding-top:3px;padding-bottom:30px}.pass-meter.hidden{display:none}.pass-meter .details,.pass-meter .pass-meter-message{margin-top:3px}.pass-meter-col{float:left;width:25%;padding:1px}.pass-meter-col .indicator{border-radius:3px;background-color:#eee;height:5px}.pass-meter-col.poor .indicator{background-color:#ef4e3a}.pass-meter-col.weak .indicator{background-color:#F27B1C}.pass-meter-col.good .indicator{background-color:#6c3}.pass-meter-col.strong .indicator{background-color:#33A7E3}.pass-meter .pass-meter-message{width:49%;text-align:right;float:right}.pass-meter .details{width:49%;text-align:left;float:left;cursor:pointer}.pass-meter .details:hover,.pass-meter .link{color:#06f!important}.detail_box .row .col{float:left;width:49%}.match-sequence .sequence{float:left;width:auto;margin-right:10px}.match-sequence .sequence table td:nth-child(2){padding-left:4px}.sequence .token{text-align:center}.sequence code{border:1px solid;padding:3px}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{position:relative;margin-top:5px;margin-bottom:5px;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;color:#ececec}tags-input .tags .tag-item.selected{background:#ce3702!important}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags{background-color:#eee;cursor:default}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input[disabled] .tags .input{background-color:#eee;cursor:default}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.button-geen{background:#37ce02;color:#fff}.button-geen:hover{background:#3ad802;color:#fff}.button-red{background:#ce3702;color:#fff}.button-red:hover{background:#d83a02;color:#fff}.link{color:#06f!important;cursor:pointer}.tab_header{margin:44px 0 0;list-style:none;padding:0}.tab_header li.tab:first-child{margin-left:0}.tab_header li.tab{float:left;border-bottom-width:0;margin:0;padding:10px;cursor:pointer;border-right:1px solid #eee;-webkit-transition:background-color 250ms linear;-moz-transition:background-color 250ms linear;-o-transition:background-color 250ms linear;-ms-transition:background-color 250ms linear;transition:background-color 250ms linear}.tab_header li.tab .indicator{display:none}.tab_header li.active{color:#fff;position:relative}.tab_header li.active .indicator{display:inline-block;position:absolute;height:7px;left:0;right:0;bottom:-1px}.tab_container{border:1px solid;border-color:#eee;border-top-color:#0082c9;border-bottom:0;clear:both;padding:0 1em}.pw-gen{overflow:hidden}.pw-gen input{width:calc(100% - 80px)!important;float:left;background:#fff;color:#555;cursor:text;font-family:inherit;border:1px solid #ddd;outline:0;border-radius:3px;margin:3px 3px 3px 0;padding:7px 6px 5px;font-size:13px;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;background-clip:padding-box}.pw-gen .generate_pw{float:left;margin-top:3px;margin-left:-3px}.pw-gen .generate_pw .cell{padding:5px;display:inline-block;font-size:14px;border:1px solid #ddd;background-color:#eaeaea;cursor:pointer}.pw-gen .generate_pw .cell:hover{color:#06f}.pw-gen .generate_pw .cell:last-child{-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;background-clip:padding-box}.warning_bar{position:absolute;width:100%;padding:12px;font-weight:700;text-align:center;z-index:800;background-color:red;color:#fff}.warning_bar .fa-times{float:right;color:#000;cursor:pointer}.vault_wrapper{margin:0 auto;margin-top:20px;width:100%;max-width:420px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box;box-shadow:0 1px 1px #777;background:#eee;display:block}.vault_wrapper .vaultlist{z-index:500}.vault_wrapper .vaultlist div,.vault_wrapper .vaultlist li,.vault_wrapper .vaultlist small,.vault_wrapper .vaultlist span{cursor:pointer}.vault_wrapper .vaultlist small{color:#8e8e8e}.vault_wrapper .vaultlist li.selected{background-color:#0082c9!important;color:#ddd}.vault_wrapper .vaultlist li{border-bottom:1px solid #8e8e8e;padding:16px}.vault_wrapper .vaultlist li:hover{background-color:#f7f7f7}.vault_wrapper .login_form{padding:16px}.vault_wrapper .login_form .error{color:#ce3702}.vault_wrapper .login_form .pw-input .last_access{color:#8e8e8e}.vault_wrapper .login_form input[type=password],.vault_wrapper .login_form input[type=text]{width:100%;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box}.vault_wrapper .login_form .button_wrapper .button{width:45%;display:inline-block}.vault_wrapper .login_form .button{margin-top:10px}@media screen and (max-width:768px){.vault_wrapper{width:90%}}#app-content{overflow-x:hidden}#app-content #app-content-wrapper{min-height:95%}#app-content #app-content-wrapper #passman-controls{text-align:center;border-bottom:1px solid #c9c9c9}#app-content #app-content-wrapper #passman-controls.sidebar-shown{padding-right:27%!important}@media screen and (max-width:765px){#app-content #app-content-wrapper #passman-controls.sidebar-shown .title{display:none}}@media screen and (min-width:769px) and (max-width:1120px){#app-content #app-content-wrapper #passman-controls.sidebar-shown .title{display:none}}#app-content #app-content-wrapper .title{text-align:center;display:inline-block;font-weight:700;margin-top:10px}@media screen and (max-width:575px){#app-content #app-content-wrapper .title{display:none}}@media screen and (min-width:769px) and (max-width:820px){#app-content #app-content-wrapper .title{display:none}}#app-content #app-content-wrapper .actions.creatable{float:left;overflow:hidden}#app-content #app-content-wrapper .actions.creatable .bubble{position:relative;width:185px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box;box-shadow:0 1px 10px rgba(50,50,50,.7)}#app-content #app-content-wrapper .actions.creatable .bubble ul li{padding-left:10px}#app-content #app-content-wrapper .actions.creatable .bubble ul .menuitem{font-size:12px;display:inline}#app-content #app-content-wrapper .actions.creatable .bubble:after{right:inherit;left:10px;top:-19px}#app-content #app-content-wrapper .viewModes{float:right;margin-right:5px;margin-top:3px}#app-content #app-content-wrapper .viewModes .view-mode:first-child{-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;background-clip:padding-box;border:1px solid rgba(240,240,240,.9)}#app-content #app-content-wrapper .viewModes .view-mode:last-child{-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;background-clip:padding-box;border:1px solid rgba(240,240,240,.9)}#app-content #app-content-wrapper .viewModes .view-mode{background-color:rgba(240,240,240,.9);cursor:pointer;display:inline-block;padding:7px}#app-content #app-content-wrapper .viewModes .view-mode.active{display:inline-block;padding:7px;background-color:rgba(226,226,226,.9)}#app-content #app-content-wrapper .searchboxContainer{display:inline-block;margin-right:14px;float:right}#app-content #app-content-wrapper .searchboxContainer .searchbox{display:inline-block}#app-content #app-content-wrapper .searchboxContainer .searchclear{color:#ccc;cursor:pointer;font-size:18px;height:14px;margin:auto;position:absolute!important;right:10px;top:12px;z-index:99999999}#app-content #app-content-wrapper .searchboxContainer .searchOptions{position:relative;bottom:5px;background:#fff;border:1px solid #ddd;padding:5px;width:calc(100% - 3px);box-shadow:3px 3px 5px #888;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;background-clip:padding-box}#app-content #app-content-wrapper .credential-table{width:100%;margin-top:44px}#app-content #app-content-wrapper .credential-table tr:hover{background-color:#f5f5f5}#app-content #app-content-wrapper .credential-table tr.selected{background-color:#f8f8f8}#app-content #app-content-wrapper .credential-table tr td{cursor:pointer;padding:5px;border-bottom:1px solid #eee}#app-content #app-content-wrapper .credential-table tr td .icon{font-size:19px;float:left;margin-right:5px;margin-left:3px}#app-content #app-content-wrapper .credential-table tr td .icon-more{display:inline-block;float:right;margin-left:5px;margin-top:1px;opacity:.4;height:20px;width:32px;cursor:pointer}#app-content #app-content-wrapper .credential-table tr td .icon-more:hover{opacity:1}#app-content #app-content-wrapper .credential-table tr td .popovermenu{margin-top:25px;height:100px;width:100px;right:-2px!important;box-shadow:0 1px 10px rgba(50,50,50,.7)}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul{display:block;width:100px;height:75px}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul li{padding:0}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul .menuitem{font-size:12px;display:inline}#app-content #app-content-wrapper .credential-table tr td .popovermenu .action{padding:10px;margin:-10px}#app-content #app-content-wrapper .tags{float:right}#app-content #app-content-wrapper .edit_credential .password_settings label .label,#app-content #app-content-wrapper .edit_credential .tags{float:left}#app-content #app-content-wrapper .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;font-size:12px;margin-right:3px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box}#app-content #app-content-wrapper .tags .tag:last-child{margin-right:8px}#app-content #app-content-wrapper .grid-view{margin-top:44px;display:flex;flex-wrap:wrap}#app-content #app-content-wrapper .grid-view .credential{display:flex;width:100%;border:2px solid rgba(240,240,240,.9);margin:25px;-webkit-border-radius:10px;border-radius:10px;background-clip:padding-box}#app-content #app-content-wrapper .grid-view .credential .credential_content{display:flex;padding:2px;flex-direction:column;width:100%;cursor:pointer;font-size:1.75em;text-align:center}#app-content #app-content-wrapper .grid-view .credential .credential_content .label{padding-top:.5em;padding-left:1em;padding-right:1em;line-height:1.3em;word-wrap:break-word}#app-content #app-content-wrapper .grid-view .credential .credential_content .tags{margin-bottom:.5em}#app-content #app-content-wrapper .grid-view .credential .credential_content .tags .tag{color:#000!important;margin-top:5px;display:inline-block}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th,#app-content #app-content-wrapper .edit_credential .files table thead th,.btn-danger{color:#fff}@media all and (min-width:40em){#app-content #app-content-wrapper .grid-view .credential{width:40%}}@media all and (min-width:58em){#app-content #app-content-wrapper .grid-view .credential{width:26%}}@media all and (min-width:78em){#app-content #app-content-wrapper .grid-view .credential{width:20%}}#app-content #app-content-wrapper .edit_credential input[type=password],#app-content #app-content-wrapper .edit_credential input[type=text],#app-content #app-content-wrapper .edit_credential tags-input .tags{width:100%}#app-content #app-content-wrapper .edit_credential{padding-top:10px}#app-content #app-content-wrapper .edit_credential label{display:block}#app-content #app-content-wrapper .edit_credential .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;font-size:11px}#app-content #app-content-wrapper .edit_credential .credential_textarea{width:100%;height:100px}#app-content #app-content-wrapper .edit_credential .password_settings label{overflow:hidden}#app-content #app-content-wrapper .edit_credential .password_settings label input[type=checkbox]{width:auto!important;float:left}#app-content #app-content-wrapper .edit_credential .password_settings label .label.sm{font-size:12px}#app-content #app-content-wrapper .edit_credential .field-value .valueInput{padding-right:0}#app-content #app-content-wrapper .edit_credential .field-value .valueInput .pw-gen .generate_pw .cell:last-child,#app-content #app-content-wrapper .edit_credential .field-value .valueInput input{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;background-clip:padding-box}#app-content #app-content-wrapper .edit_credential .field-value .selectType{padding-left:0;margin-left:-4px}#app-content #app-content-wrapper .edit_credential .field-value .selectType select{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;background-clip:padding-box}#app-content #app-content-wrapper .edit_credential .custom_fields,#app-content #app-content-wrapper .edit_credential .files{margin-top:10px}#app-content #app-content-wrapper .edit_credential .custom_fields table,#app-content #app-content-wrapper .edit_credential .files table{width:100%}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th.dragger,#app-content #app-content-wrapper .edit_credential .files table thead th.dragger{width:3%}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th.field_actions,#app-content #app-content-wrapper .edit_credential .files table thead th.field_actions{width:15%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr:hover,#app-content #app-content-wrapper .edit_credential .files table tr:hover{background-color:transparent}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.dragger,#app-content #app-content-wrapper .edit_credential .files table tr td.dragger{width:3%;text-align:center;cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.field_actions,#app-content #app-content-wrapper .edit_credential .files table tr td.field_actions{font-size:13px;width:15%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.field_actions i,#app-content #app-content-wrapper .edit_credential .files table tr td.field_actions i{cursor:pointer}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td,#app-content #app-content-wrapper .edit_credential .custom_fields table tr th,#app-content #app-content-wrapper .edit_credential .files table tr td,#app-content #app-content-wrapper .edit_credential .files table tr th{width:20%;padding:5px}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .custom_fields table tr th .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .files table tr td .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .files table tr th .editable-has-buttons.editable-input{width:55%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td,#app-content #app-content-wrapper .edit_credential .files table tr td{height:50px;vertical-align:middle}#app-content #app-content-wrapper .app_sidebar{padding:10px;overflow-y:auto}#app-content #app-content-wrapper .app_sidebar h2{margin-bottom:10px;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90%}#app-content #app-content-wrapper .app_sidebar .close.icon-close{position:absolute;top:10px;right:10px;cursor:pointer}#app-content #app-content-wrapper .app_sidebar.item_selected{height:25%;display:inline-block}#app-content #app-content-wrapper .app_sidebar .credential-data .row{margin-bottom:11px}#app-content #app-content-wrapper .app_sidebar .credential-data .tags{margin-top:15px;margin-bottom:15px;float:none}#app-content #app-content-wrapper .app_sidebar .credential-data .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;margin-right:3px}.credential_field .tools .cell,.inputfile+label{margin-right:4px;cursor:pointer}.credential_field{overflow:hidden}.credential_field .cell,.credential_field .value{float:left}.credential_field .value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:70%}.credential_field .tools{margin-left:10px;overflow:hidden;float:left}.progress{margin-top:10px;height:20px}.progress .progress-bar{position:relative;height:20px;background-image:none;background-color:#0082c9}.progress .progress-bar .progress-label{position:absolute;top:0;z-index:2;text-align:center;width:100%}.loaderContainer{height:140px;width:120px;margin-top:30px;margin-left:-60px;top:50%;left:50%;position:absolute}.loaderContainer .text{width:120px;text-align:center}.loader{border-bottom:10px solid #1d2d44;border-left:10px solid #c9c9c9;border-right:10px solid #c9c9c9;border-top:10px solid #c9c9c9;height:120px;width:120px;border-radius:120px;animation:1.1s linear 0s normal none infinite running load8}@keyframes load8{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.inputfile{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}#app-navigation li a tags-input,#app-navigation li a.taginput{opacity:1}.inputfile+label{font-size:1.25em;background-color:rgba(240,240,240,.9);margin-top:4px;padding:5px;border-right:1px solid #c9c9c9}.inputfile+label:hover,.inputfile:focus+label{background-color:#c9c9c9}.error,.shared_table .fa-trash:hover{color:#ce3702}.settings-container div{padding-left:15px}.nav-trashbin{position:fixed!important;bottom:44px;width:inherit!important;background-color:#fff;border-right:1px solid #eee}.nav-trashbin a{padding:0 20px}.nav-trashbin a .fa{margin-right:15px}#app-navigation li a{overflow:visible}#app-navigation li a tags-input li{width:auto!important}#app-navigation>ul ul{display:inherit!important}.sharing_table td:first-child{width:55%}.sharing_table td:first-child tags-input .tags,.table{width:100%}.sharing_table td:first-child .autocomplete{margin-top:35px}.share_credential{padding-top:10px}.share_credential input{width:auto}.share_credential>div{margin-bottom:10px}.shared_table .fa-trash{cursor:pointer}.scan-result-table{margin-top:10px}.scan-result-table .score{padding-left:0;padding-right:15px}.import_log{max-height:600px;overflow-y:auto}.import_log textarea{width:90%;height:200px}.tab_container.settings{margin-bottom:50px}#app-settings-content:not(.ng-hide){height:90px;display:inherit!important;padding:0;transition:height .15s ease-out}#app-settings-content.ng-hide{display:inherit!important;height:0;padding:0;transition:height .15s ease-in}.ui-dialog{z-index:9999}#notification .row{margin-left:0!important;margin-right:0!important}#passman-controls{position:fixed;top:45px;right:0;left:0;padding:0!important;margin:0;background-color:rgba(255,255,255,.95);z-index:50;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:44px!important}@media only screen and (max-width:768px){#passman-controls{width:100%}}@media only screen and (min-width:768px){#app-navigation+#app-content #passman-controls{left:250px;width:calc(100% - 250px)!important}}#passman-controls,#passman-controls .button,#passman-controls input[type=submit],#passman-controls input[type=text],#passman-controls input[type=password],#passman-controls select{box-sizing:border-box;display:inline-block;height:36px;padding:7px 10px}.nopadding{padding-right:0;padding-left:0} \ No newline at end of file
diff --git a/docs/api.md b/docs/api.md
new file mode 100644
index 00000000..4fd9dea0
--- /dev/null
+++ b/docs/api.md
@@ -0,0 +1,157 @@
+Passman offers a api for extensions.
+
+
+##Table of Contents
+- [Authentication](#authentication)
+- [Get vaults](#get-vaults-get)
+- [Get vault](#get-vault-get)
+- [Create new credential](#create-new-credential-post)
+- [Update credential](#update-credential-patch)
+- [Decrypting Credentials / challenge password ](#decrypting-credentials--challenge-password)
+
+##Authentication
+All apps must authenticate.
+For example in JS it would be:
+```
+ var encodedLogin ="MyUsername:MyPassword";
+ var request = new XMLHttpRequest({"mozAnon": true});
+ request.setRequestHeader("Authorization", "Basic " + encodedLogin);
+ request.setRequestHeader("Content-Type", "application/json");
+```
+An other option is logging in via HTTP Basic auth.
+In this case an example would be:
+`https://MyUsername:Mypassword@nextcloudinstance.com`
+
+Connectivity via http is possible, but you *MUST* warn that their login credentials are send in plaintext.
+The credentials from passman are still send encrypted if http is used.
+
+
+###Get vaults [GET]
+`/apps/passman/api/v2/vaults`
+This will return a list of vaults.
+A vault consists of the following properties:
+```
+{
+ "vault_id":17,
+ "guid":"64DDADA1-54A6-4BE6-AA2F-BCB2EC8E8455",
+ "name":"test",
+ "created":1484175865,
+ "public_sharing_key":"-----BEGIN PUBLIC KEY-----\r\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1h6j+vLcvJDUgOi6VkjzDKTT0\r\nLXluie7+VH2DjnzeXO2QalHI1qAzd\/G51r2NArgwzKMm9g\/kGN1V+mcX3j2WZu\/E\r\n8o5jk83LaSlgcG9GIbOyXUXJlflvctnhPa8Em3GoM\/ZfO2EkkDYANTKvyiyRXroa\r\ny6m2C+aJVzxmhj5tvQIDAQAB\r\n-----END PUBLIC KEY-----\r\n",
+ "last_access":1484216598,
+ "challenge_password":"eyJpdiI6IkFEWExocDFsRWFZSEZhc0cxY2NzUnciLCJ2IjoxLCJpdGVyIjoxMDAwLCJrcyI6MjU2LCJ0cyI6NjQsIm1vZGUiOiJjY20iLCJhZGF0YSI6IiIsImNpcGhlciI6ImFlcyIsInNhbHQiOiJFVmdZLzIxNmI0USIsImN0IjoiU3d5QUkzdVFqenh1cStwaCJ9"
+}
+```
+Short description of the fields:
+- `vault_id` -Id of the vault, only used within queries
+- `vault_guid` - The guid of the vault, use this when making requests
+- `name` - The name of the vault
+- `created` - Timestamp when the vault was created
+- `public_sharing_key` - The public sharing key
+- `last_access` - Timestamp when the vault was last accessed
+- `challenge_password` - Encrypted challenge password, you can use this to check if the user provided a correct password.
+
+
+###Get vault [GET]
+`/apps/passman/api/v2/vaults/{vault_guid}`
+To request the credentials.
+This will return the requested vault and it's credentials
+```$xslt
+created:1484175865
+credentials: [{}, {}, ....]
+guid:"64DDADA1-54A6-4BE6-AA2F-BCB2EC8E8455"
+last_access:1484217620
+name: "test"
+private_sharing_key ''
+public_sharing_key: ''
+sharing_keys_generated:1484175865
+vault_id:17
+vault_settings:null
+```
+To see how a credential is build up (which fields), see [create new credential](#Create new credential).
+
+###Create new credential [POST]
+`/api/v2/credentials`
+Fields:
+```$xslt
+var credential = {
+ 'vault_id': int,
+ 'label': string,
+ 'description': string,
+ 'created': null (Will be set server side),
+ 'changed': null (Will be set server side),
+ 'tags': [{text: string}],
+ 'email': string,
+ 'username': string,
+ 'password': string (encrypted),
+ 'url': string (encrypted),
+ 'favicon': string,
+ 'renew_interval': int,
+ 'expire_time': timestamp,
+ 'delete_time': timestamp,
+ 'files': [
+ {
+ filename: string,
+ size: int (size in bytes),
+ mimetype: string,
+ guid: string (generated server side)
+ }
+ ],
+ 'custom_fields': [
+ {
+ label: string,
+ value: string,
+ secret: bool,
+ field_type: 'text'
+ }
+ ],
+ 'otp': {},
+ 'hidden': false
+ };
+```
+There are a few special fields here.
+- `custom_fields`
+ - Those fields are added by the user `secret` indicates if the value should be hidden
+
+When posting to the endpoint the following fields are required:
+- `label`
+- `vault_id`
+
+###Update credential [PATCH]
+`/api/v2/credentials/{credential_guid}`
+See [create new credential](#Create new credential).
+
+
+
+###Decrypting Credentials / challenge password
+For the client side encryption we use [sjcl](https://github.com/bitwiseshiftleft/sjcl)
+To decrypt (and test if a valid key is given):
+```$xslt
+var encryption_config = {
+ adata: "",
+ iter: 1000,
+ ks: 256,
+ mode: 'ccm',
+ ts: 64
+};
+var ciphertext = window.atob(encryptedString);
+var rp = {};
+try {
+ return sjcl.decrypt(_key, ciphertext, encryption_config, rp);
+} catch (e) {
+ throw e; // Invalid key
+}
+```
+
+For decrypting the credentials you can use above code.
+The following fields are encrypted:
+- `description`
+- `username`
+- `password`
+- `files`
+- `custom_fields`
+- `otp`
+- `email`
+- `tags`
+- `url`
+
+
diff --git a/js/passman.min.js b/js/passman.min.js
index a488b9b9..6145e011 100644
--- a/js/passman.min.js
+++ b/js/passman.min.js
@@ -1,4 +1,4 @@
-/*! Passman 2017-01-06 */
+/*! Passman 2017-01-16 */
function _a1(b,a){this.count=b,this._fc=a,this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("_dm",function(){return this._fc})}function _a2(a,c,b){this._bm=a,b?this._do=new Array(c,b):this._do=new Array(c),this.__defineGetter__("_bo",function(){return this._bm}),this.__defineGetter__("_dn",function(){return this._bm*this._fo}),this.__defineGetter__("_fo",function(){for(var e=0,d=0;d<this._do.length;d++)e+=this._do[d].length;return e}),this._fb=function(){return this._do}}function _a3(k,l,h,g,f,e){this._bs=k,this._ar=l,this._do=new Array(h,g,f,e);for(var j=0,b=h._bo,a=h._fb(),d=0;d<a.length;d++){var c=a[d];j+=c.Count*(c._dm+b)}this._br=j,this.__defineGetter__("_fd",function(){return this._bs}),this.__defineGetter__("_as",function(){return this._ar}),this.__defineGetter__("_dp",function(){return this._br}),this.__defineGetter__("_cr",function(){return 17+4*this._bs}),this._aq=function(){var r=this._cr,o=new _ac(r);o._bq(0,0,9,9),o._bq(r-8,0,8,9),o._bq(0,r-8,9,8);for(var n=this._ar.length,m=0;m<n;m++)for(var q=this._ar[m]-2,s=0;s<n;s++)0==m&&(0==s||s==n-1)||m==n-1&&0==s||o._bq(this._ar[s]-2,q,5,5);return o._bq(6,9,1,r-17),o._bq(9,6,r-17,1),this._bs>6&&(o._bq(r-11,0,3,6),o._bq(0,r-11,6,3)),o},this._bu=function(i){return this._do[i.ordinal()]}}function _ay(){return new Array(new _a3(1,new Array,new _a2(7,new _a1(1,19)),new _a2(10,new _a1(1,16)),new _a2(13,new _a1(1,13)),new _a2(17,new _a1(1,9))),new _a3(2,new Array(6,18),new _a2(10,new _a1(1,34)),new _a2(16,new _a1(1,28)),new _a2(22,new _a1(1,22)),new _a2(28,new _a1(1,16))),new _a3(3,new Array(6,22),new _a2(15,new _a1(1,55)),new _a2(26,new _a1(1,44)),new _a2(18,new _a1(2,17)),new _a2(22,new _a1(2,13))),new _a3(4,new Array(6,26),new _a2(20,new _a1(1,80)),new _a2(18,new _a1(2,32)),new _a2(26,new _a1(2,24)),new _a2(16,new _a1(4,9))),new _a3(5,new Array(6,30),new _a2(26,new _a1(1,108)),new _a2(24,new _a1(2,43)),new _a2(18,new _a1(2,15),new _a1(2,16)),new _a2(22,new _a1(2,11),new _a1(2,12))),new _a3(6,new Array(6,34),new _a2(18,new _a1(2,68)),new _a2(16,new _a1(4,27)),new _a2(24,new _a1(4,19)),new _a2(28,new _a1(4,15))),new _a3(7,new Array(6,22,38),new _a2(20,new _a1(2,78)),new _a2(18,new _a1(4,31)),new _a2(18,new _a1(2,14),new _a1(4,15)),new _a2(26,new _a1(4,13),new _a1(1,14))),new _a3(8,new Array(6,24,42),new _a2(24,new _a1(2,97)),new _a2(22,new _a1(2,38),new _a1(2,39)),new _a2(22,new _a1(4,18),new _a1(2,19)),new _a2(26,new _a1(4,14),new _a1(2,15))),new _a3(9,new Array(6,26,46),new _a2(30,new _a1(2,116)),new _a2(22,new _a1(3,36),new _a1(2,37)),new _a2(20,new _a1(4,16),new _a1(4,17)),new _a2(24,new _a1(4,12),new _a1(4,13))),new _a3(10,new Array(6,28,50),new _a2(18,new _a1(2,68),new _a1(2,69)),new _a2(26,new _a1(4,43),new _a1(1,44)),new _a2(24,new _a1(6,19),new _a1(2,20)),new _a2(28,new _a1(6,15),new _a1(2,16))),new _a3(11,new Array(6,30,54),new _a2(20,new _a1(4,81)),new _a2(30,new _a1(1,50),new _a1(4,51)),new _a2(28,new _a1(4,22),new _a1(4,23)),new _a2(24,new _a1(3,12),new _a1(8,13))),new _a3(12,new Array(6,32,58),new _a2(24,new _a1(2,92),new _a1(2,93)),new _a2(22,new _a1(6,36),new _a1(2,37)),new _a2(26,new _a1(4,20),new _a1(6,21)),new _a2(28,new _a1(7,14),new _a1(4,15))),new _a3(13,new Array(6,34,62),new _a2(26,new _a1(4,107)),new _a2(22,new _a1(8,37),new _a1(1,38)),new _a2(24,new _a1(8,20),new _a1(4,21)),new _a2(22,new _a1(12,11),new _a1(4,12))),new _a3(14,new Array(6,26,46,66),new _a2(30,new _a1(3,115),new _a1(1,116)),new _a2(24,new _a1(4,40),new _a1(5,41)),new _a2(20,new _a1(11,16),new _a1(5,17)),new _a2(24,new _a1(11,12),new _a1(5,13))),new _a3(15,new Array(6,26,48,70),new _a2(22,new _a1(5,87),new _a1(1,88)),new _a2(24,new _a1(5,41),new _a1(5,42)),new _a2(30,new _a1(5,24),new _a1(7,25)),new _a2(24,new _a1(11,12),new _a1(7,13))),new _a3(16,new Array(6,26,50,74),new _a2(24,new _a1(5,98),new _a1(1,99)),new _a2(28,new _a1(7,45),new _a1(3,46)),new _a2(24,new _a1(15,19),new _a1(2,20)),new _a2(30,new _a1(3,15),new _a1(13,16))),new _a3(17,new Array(6,30,54,78),new _a2(28,new _a1(1,107),new _a1(5,108)),new _a2(28,new _a1(10,46),new _a1(1,47)),new _a2(28,new _a1(1,22),new _a1(15,23)),new _a2(28,new _a1(2,14),new _a1(17,15))),new _a3(18,new Array(6,30,56,82),new _a2(30,new _a1(5,120),new _a1(1,121)),new _a2(26,new _a1(9,43),new _a1(4,44)),new _a2(28,new _a1(17,22),new _a1(1,23)),new _a2(28,new _a1(2,14),new _a1(19,15))),new _a3(19,new Array(6,30,58,86),new _a2(28,new _a1(3,113),new _a1(4,114)),new _a2(26,new _a1(3,44),new _a1(11,45)),new _a2(26,new _a1(17,21),new _a1(4,22)),new _a2(26,new _a1(9,13),new _a1(16,14))),new _a3(20,new Array(6,34,62,90),new _a2(28,new _a1(3,107),new _a1(5,108)),new _a2(26,new _a1(3,41),new _a1(13,42)),new _a2(30,new _a1(15,24),new _a1(5,25)),new _a2(28,new _a1(15,15),new _a1(10,16))),new _a3(21,new Array(6,28,50,72,94),new _a2(28,new _a1(4,116),new _a1(4,117)),new _a2(26,new _a1(17,42)),new _a2(28,new _a1(17,22),new _a1(6,23)),new _a2(30,new _a1(19,16),new _a1(6,17))),new _a3(22,new Array(6,26,50,74,98),new _a2(28,new _a1(2,111),new _a1(7,112)),new _a2(28,new _a1(17,46)),new _a2(30,new _a1(7,24),new _a1(16,25)),new _a2(24,new _a1(34,13))),new _a3(23,new Array(6,30,54,74,102),new _a2(30,new _a1(4,121),new _a1(5,122)),new _a2(28,new _a1(4,47),new _a1(14,48)),new _a2(30,new _a1(11,24),new _a1(14,25)),new _a2(30,new _a1(16,15),new _a1(14,16))),new _a3(24,new Array(6,28,54,80,106),new _a2(30,new _a1(6,117),new _a1(4,118)),new _a2(28,new _a1(6,45),new _a1(14,46)),new _a2(30,new _a1(11,24),new _a1(16,25)),new _a2(30,new _a1(30,16),new _a1(2,17))),new _a3(25,new Array(6,32,58,84,110),new _a2(26,new _a1(8,106),new _a1(4,107)),new _a2(28,new _a1(8,47),new _a1(13,48)),new _a2(30,new _a1(7,24),new _a1(22,25)),new _a2(30,new _a1(22,15),new _a1(13,16))),new _a3(26,new Array(6,30,58,86,114),new _a2(28,new _a1(10,114),new _a1(2,115)),new _a2(28,new _a1(19,46),new _a1(4,47)),new _a2(28,new _a1(28,22),new _a1(6,23)),new _a2(30,new _a1(33,16),new _a1(4,17))),new _a3(27,new Array(6,34,62,90,118),new _a2(30,new _a1(8,122),new _a1(4,123)),new _a2(28,new _a1(22,45),new _a1(3,46)),new _a2(30,new _a1(8,23),new _a1(26,24)),new _a2(30,new _a1(12,15),new _a1(28,16))),new _a3(28,new Array(6,26,50,74,98,122),new _a2(30,new _a1(3,117),new _a1(10,118)),new _a2(28,new _a1(3,45),new _a1(23,46)),new _a2(30,new _a1(4,24),new _a1(31,25)),new _a2(30,new _a1(11,15),new _a1(31,16))),new _a3(29,new Array(6,30,54,78,102,126),new _a2(30,new _a1(7,116),new _a1(7,117)),new _a2(28,new _a1(21,45),new _a1(7,46)),new _a2(30,new _a1(1,23),new _a1(37,24)),new _a2(30,new _a1(19,15),new _a1(26,16))),new _a3(30,new Array(6,26,52,78,104,130),new _a2(30,new _a1(5,115),new _a1(10,116)),new _a2(28,new _a1(19,47),new _a1(10,48)),new _a2(30,new _a1(15,24),new _a1(25,25)),new _a2(30,new _a1(23,15),new _a1(25,16))),new _a3(31,new Array(6,30,56,82,108,134),new _a2(30,new _a1(13,115),new _a1(3,116)),new _a2(28,new _a1(2,46),new _a1(29,47)),new _a2(30,new _a1(42,24),new _a1(1,25)),new _a2(30,new _a1(23,15),new _a1(28,16))),new _a3(32,new Array(6,34,60,86,112,138),new _a2(30,new _a1(17,115)),new _a2(28,new _a1(10,46),new _a1(23,47)),new _a2(30,new _a1(10,24),new _a1(35,25)),new _a2(30,new _a1(19,15),new _a1(35,16))),new _a3(33,new Array(6,30,58,86,114,142),new _a2(30,new _a1(17,115),new _a1(1,116)),new _a2(28,new _a1(14,46),new _a1(21,47)),new _a2(30,new _a1(29,24),new _a1(19,25)),new _a2(30,new _a1(11,15),new _a1(46,16))),new _a3(34,new Array(6,34,62,90,118,146),new _a2(30,new _a1(13,115),new _a1(6,116)),new _a2(28,new _a1(14,46),new _a1(23,47)),new _a2(30,new _a1(44,24),new _a1(7,25)),new _a2(30,new _a1(59,16),new _a1(1,17))),new _a3(35,new Array(6,30,54,78,102,126,150),new _a2(30,new _a1(12,121),new _a1(7,122)),new _a2(28,new _a1(12,47),new _a1(26,48)),new _a2(30,new _a1(39,24),new _a1(14,25)),new _a2(30,new _a1(22,15),new _a1(41,16))),new _a3(36,new Array(6,24,50,76,102,128,154),new _a2(30,new _a1(6,121),new _a1(14,122)),new _a2(28,new _a1(6,47),new _a1(34,48)),new _a2(30,new _a1(46,24),new _a1(10,25)),new _a2(30,new _a1(2,15),new _a1(64,16))),new _a3(37,new Array(6,28,54,80,106,132,158),new _a2(30,new _a1(17,122),new _a1(4,123)),new _a2(28,new _a1(29,46),new _a1(14,47)),new _a2(30,new _a1(49,24),new _a1(10,25)),new _a2(30,new _a1(24,15),new _a1(46,16))),new _a3(38,new Array(6,32,58,84,110,136,162),new _a2(30,new _a1(4,122),new _a1(18,123)),new _a2(28,new _a1(13,46),new _a1(32,47)),new _a2(30,new _a1(48,24),new _a1(14,25)),new _a2(30,new _a1(42,15),new _a1(32,16))),new _a3(39,new Array(6,26,54,82,110,138,166),new _a2(30,new _a1(20,117),new _a1(4,118)),new _a2(28,new _a1(40,47),new _a1(7,48)),new _a2(30,new _a1(43,24),new _a1(22,25)),new _a2(30,new _a1(10,15),new _a1(67,16))),new _a3(40,new Array(6,30,58,86,114,142,170),new _a2(30,new _a1(19,118),new _a1(6,119)),new _a2(28,new _a1(18,47),new _a1(31,48)),new _a2(30,new _a1(34,24),new _a1(34,25)),new _a2(30,new _a1(20,15),new _a1(61,16))))}function _ae(i,f,c,h,e,b,g,d,a){this.a11=i,this.a12=h,this.a13=g,this.a21=f,this.a22=e,this.a23=d,this.a31=c,this.a32=b,this.a33=a,this._ad=function(w){for(var t=w.length,A=this.a11,z=this.a12,v=this.a13,r=this.a21,q=this.a22,o=this.a23,m=this.a31,k=this.a32,j=this.a33,n=0;n<t;n+=2){var u=w[n],s=w[n+1],l=v*u+o*s+j;w[n]=(A*u+r*s+m)/l,w[n+1]=(z*u+q*s+k)/l}},this._fp=function(m,k){for(var r=m.length,l=0;l<r;l++){var j=m[l],q=k[l],o=this.a13*j+this.a23*q+this.a33;m[l]=(this.a11*j+this.a21*q+this.a31)/o,k[l]=(this.a12*j+this.a22*q+this.a32)/o}},this._fr=function(){return new _ae(this.a22*this.a33-this.a23*this.a32,this.a23*this.a31-this.a21*this.a33,this.a21*this.a32-this.a22*this.a31,this.a13*this.a32-this.a12*this.a33,this.a11*this.a33-this.a13*this.a31,this.a12*this.a31-this.a11*this.a32,this.a12*this.a23-this.a13*this.a22,this.a13*this.a21-this.a11*this.a23,this.a11*this.a22-this.a12*this.a21)},this.times=function(j){return new _ae(this.a11*j.a11+this.a21*j.a12+this.a31*j.a13,this.a11*j.a21+this.a21*j.a22+this.a31*j.a23,this.a11*j.a31+this.a21*j.a32+this.a31*j.a33,this.a12*j.a11+this.a22*j.a12+this.a32*j.a13,this.a12*j.a21+this.a22*j.a22+this.a32*j.a23,this.a12*j.a31+this.a22*j.a32+this.a32*j.a33,this.a13*j.a11+this.a23*j.a12+this.a33*j.a13,this.a13*j.a21+this.a23*j.a22+this.a33*j.a23,this.a13*j.a31+this.a23*j.a32+this.a33*j.a33)}}function _bg(b,a){this.bits=b,this.points=a}function Detector(a){this.image=a,this._am=null,this._bi=function(m,l,c,b){var d=Math.abs(b-l)>Math.abs(c-m);if(d){var s=m;m=l,l=s,s=c,c=b,b=s}for(var j=Math.abs(c-m),i=Math.abs(b-l),q=-j>>1,v=l<b?1:-1,f=m<c?1:-1,e=0,h=m,g=l;h!=c;h+=f){var u=d?g:h,t=d?h:g;if(1==e?this.image[u+t*qrcode.width]&&e++:this.image[u+t*qrcode.width]||e++,3==e){var o=h-m,n=g-l;return Math.sqrt(o*o+n*n)}if(q+=i,q>0){if(g==b)break;g+=v,q-=j}}var k=c-m,r=b-l;return Math.sqrt(k*k+r*r)},this._bh=function(i,g,h,f){var b=this._bi(i,g,h,f),e=1,d=i-(h-i);d<0?(e=i/(i-d),d=0):d>=qrcode.width&&(e=(qrcode.width-1-i)/(d-i),d=qrcode.width-1);var c=Math.floor(g-(f-g)*e);return e=1,c<0?(e=g/(g-c),c=0):c>=qrcode.height&&(e=(qrcode.height-1-g)/(c-g),c=qrcode.height-1),d=Math.floor(i+(d-i)*e),b+=this._bi(i,g,d,c),b-1},this._bj=function(c,d){var b=this._bh(Math.floor(c.X),Math.floor(c.Y),Math.floor(d.X),Math.floor(d.Y)),e=this._bh(Math.floor(d.X),Math.floor(d.Y),Math.floor(c.X),Math.floor(c.Y));return isNaN(b)?e/7:isNaN(e)?b/7:(b+e)/14},this._bk=function(d,c,b){return(this._bj(d,c)+this._bj(d,b))/2},this.distance=function(c,b){return xDiff=c.X-b.X,yDiff=c.Y-b.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)},this._bx=function(g,f,d,e){var b=Math.round(this.distance(g,f)/e),c=Math.round(this.distance(g,d)/e),h=(b+c>>1)+7;switch(3&h){case 0:h++;break;case 2:h--;break;case 3:throw"Error"}return h},this._bl=function(g,f,d,j){var k=Math.floor(j*g),h=Math.max(0,f-k),i=Math.min(qrcode.width-1,f+k);if(i-h<3*g)throw"Error";var b=Math.max(0,d-k),c=Math.min(qrcode.height-1,d+k),e=new _ak(this.image,h,b,i-h,c-b,g,this._am);return e.find()},this.createTransform=function(l,h,k,b,g){var i,f,e,c,j=g-3.5;null!=b?(i=b.X,f=b.Y,e=c=j-3):(i=h.X-l.X+k.X,f=h.Y-l.Y+k.Y,e=c=j);var d=_ae._ag(3.5,3.5,j,3.5,e,c,3.5,j,l.X,l.Y,h.X,h.Y,i,f,k.X,k.Y);return d},this._bz=function(e,b,d){var c=_aa;return c._af(e,d,b)},this._cd=function(r){var j=r._gq,h=r._gs,n=r._gp,d=this._bk(j,h,n);if(d<1)throw"Error";var s=this._bx(j,h,n,d),b=_a3._at(s),k=b._cr-7,l=null;if(b._as.length>0)for(var f=h.X-j.X+n.X,e=h.Y-j.Y+n.Y,c=1-3/k,u=Math.floor(j.X+c*(f-j.X)),t=Math.floor(j.Y+c*(e-j.Y)),q=4;q<=16;q<<=1){l=this._bl(d,u,t,q);break}var o,g=this.createTransform(j,h,n,l,s),m=this._bz(this.image,g,s);return o=null==l?new Array(n,j,h):new Array(n,j,h,l),new _bg(m,o)},this.detect=function(){var b=(new _cc)._ce(this.image);return this._cd(b)}}function _ax(a){this._cf=_cg.forBits(a>>3&3),this._fe=7&a,this.__defineGetter__("_cg",function(){return this._cf}),this.__defineGetter__("_dx",function(){return this._fe}),this.GetHashCode=function(){return this._cf.ordinal()<<3|_fe},this.Equals=function(c){var b=c;return this._cf==b._cf&&this._fe==b._fe}}function _cg(a,c,b){this._ff=a,this.bits=c,this.name=b,this.__defineGetter__("Bits",function(){return this.bits}),this.__defineGetter__("Name",function(){return this.name}),this.ordinal=function(){return this._ff}}function _ac(d,a){if(a||(a=d),d<1||a<1)throw"Both dimensions must be greater than 0";this.width=d,this.height=a;var c=d>>5;0!=(31&d)&&c++,this.rowSize=c,this.bits=new Array(c*a);for(var b=0;b<this.bits.length;b++)this.bits[b]=0;this.__defineGetter__("Width",function(){return this.width}),this.__defineGetter__("Height",function(){return this.height}),this.__defineGetter__("Dimension",function(){if(this.width!=this.height)throw"Can't call getDimension() on a non-square matrix";return this.width}),this._ds=function(e,g){var f=g*this.rowSize+(e>>5);return 0!=(1&_ew(this.bits[f],31&e))},this._dq=function(e,g){var f=g*this.rowSize+(e>>5);this.bits[f]|=1<<(31&e)},this.flip=function(e,g){var f=g*this.rowSize+(e>>5);this.bits[f]^=1<<(31&e)},this.clear=function(){for(var e=this.bits.length,f=0;f<e;f++)this.bits[f]=0},this._bq=function(g,j,f,m){if(j<0||g<0)throw"Left and top must be nonnegative";if(m<1||f<1)throw"Height and width must be at least 1";var l=g+f,e=j+m;if(e>this.height||l>this.width)throw"The region must fit inside the matrix";for(var i=j;i<e;i++)for(var h=i*this.rowSize,k=g;k<l;k++)this.bits[h+(k>>5)]|=1<<(31&k)}}function _dl(a,b){this._dv=a,this._dw=b,this.__defineGetter__("_du",function(){return this._dv}),this.__defineGetter__("Codewords",function(){return this._dw})}function _cl(a){var b=a.Dimension;if(b<21||1!=(3&b))throw"Error _cl";this._au=a,this._cp=null,this._co=null,this._dk=function(d,c,e){return this._au._ds(d,c)?e<<1|1:e<<1},this._cm=function(){if(null!=this._co)return this._co;for(var g=0,e=0;e<6;e++)g=this._dk(e,8,g);g=this._dk(7,8,g),g=this._dk(8,8,g),g=this._dk(8,7,g);for(var c=5;c>=0;c--)g=this._dk(8,c,g);if(this._co=_ax._ci(g),null!=this._co)return this._co;var f=this._au.Dimension;g=0;for(var d=f-8,e=f-1;e>=d;e--)g=this._dk(e,8,g);for(var c=f-7;c<f;c++)g=this._dk(8,c,g);if(this._co=_ax._ci(g),null!=this._co)return this._co;throw"Error _cm"},this._cq=function(){if(null!=this._cp)return this._cp;var h=this._au.Dimension,f=h-17>>2;if(f<=6)return _a3._av(f);for(var g=0,e=h-11,c=5;c>=0;c--)for(var d=h-9;d>=e;d--)g=this._dk(d,c,g);if(this._cp=_a3._aw(g),null!=this._cp&&this._cp._cr==h)return this._cp;g=0;for(var d=5;d>=0;d--)for(var c=h-9;c>=e;c--)g=this._dk(d,c,g);if(this._cp=_a3._aw(g),null!=this._cp&&this._cp._cr==h)return this._cp;throw"Error _cq"},this._gk=function(){var r=this._cm(),o=this._cq(),c=_dx._gl(r._dx),f=this._au.Dimension;c._dj(this._au,f);for(var k=o._aq(),n=!0,s=new Array(o._dp),m=0,q=0,h=0,e=f-1;e>0;e-=2){6==e&&e--;for(var l=0;l<f;l++)for(var g=n?f-1-l:l,d=0;d<2;d++)k._ds(e-d,g)||(h++,q<<=1,this._au._ds(e-d,g)&&(q|=1),8==h&&(s[m++]=q,h=0,q=0));n^=!0}if(m!=o._dp)throw"Error _gk";return s}}function _fg(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return 0==(b+a&1)}}function _fh(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return 0==(1&b)}}function _fi(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return a%3==0}}function _fj(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return(b+a)%3==0}}function _fk(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return 0==(_ew(b,1)+a/3&1)}}function _fl(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(c,b){var a=c*b;return(1&a)+a%3==0}}function _fm(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(c,b){var a=c*b;return 0==((1&a)+a%3&1)}}function _fn(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return 0==((b+a&1)+b*a%3&1)}}function _db(_fa){this._fa=_fa,this.decode=function(received,_fv){for(var poly=new _bp(this._fa,received),_dh=new Array(_fv),i=0;i<_dh.length;i++)_dh[i]=0;for(var _fq=!1,noError=!0,i=0;i<_fv;i++){var eval=poly.evaluateAt(this._fa.exp(_fq?i+1:i));_dh[_dh.length-1-i]=eval,0!=eval&&(noError=!1)}if(!noError)for(var _fu=new _bp(this._fa,_dh),_dg=this._eb(this._fa._ba(_fv,1),_fu,_fv),sigma=_dg[0],omega=_dg[1],_dz=this._ey(sigma),_ea=this._di(omega,_dz,_fq),i=0;i<_dz.length;i++){var position=received.length-1-this._fa.log(_dz[i]);if(position<0)throw"ReedSolomonException Bad error location";received[position]=_az._bd(received[position],_ea[i])}},this._eb=function(a,b,R){if(a._ec<b._ec){var temp=a;a=b,b=temp}for(var rLast=a,r=b,sLast=this._fa.One,s=this._fa.Zero,tLast=this._fa.Zero,t=this._fa.One;r._ec>=Math.floor(R/2);){var rLastLast=rLast,_ga=sLast,_gb=tLast;if(rLast=r,sLast=s,tLast=t,rLast.Zero)throw"r_{i-1} was zero";r=rLastLast;for(var q=this._fa.Zero,_df=rLast._ex(rLast._ec),_fy=this._fa.inverse(_df);r._ec>=rLast._ec&&!r.Zero;){var _fx=r._ec-rLast._ec,scale=this._fa.multiply(r._ex(r._ec),_fy);q=q._bd(this._fa._ba(_fx,scale)),r=r._bd(rLast._dc(_fx,scale))}s=q.multiply1(sLast)._bd(_ga),t=q.multiply1(tLast)._bd(_gb)}var _de=t._ex(0);if(0==_de)throw"ReedSolomonException sigmaTilde(0) was zero";var inverse=this._fa.inverse(_de),sigma=t.multiply2(inverse),omega=r.multiply2(inverse);return new Array(sigma,omega)},this._ey=function(_ez){var _fz=_ez._ec;if(1==_fz)return new Array(_ez._ex(1));for(var result=new Array(_fz),e=0,i=1;i<256&&e<_fz;i++)0==_ez.evaluateAt(i)&&(result[e]=this._fa.inverse(i),e++);if(e!=_fz)throw"Error locator degree does not match number of roots";return result},this._di=function(_fs,_dz,_fq){for(var s=_dz.length,result=new Array(s),i=0;i<s;i++){for(var _gc=this._fa.inverse(_dz[i]),_dr=1,j=0;j<s;j++)i!=j&&(_dr=this._fa.multiply(_dr,_az._bd(1,this._fa.multiply(_dz[j],_gc))));result[i]=this._fa.multiply(_fs.evaluateAt(_gc),this._fa.inverse(_dr)),_fq&&(result[i]=this._fa.multiply(result[i],_gc))}return result}}function _bp(f,e){if(null==e||0==e.length)throw"bad arguments";this._fa=f;var c=e.length;if(c>1&&0==e[0]){for(var d=1;d<c&&0==e[d];)d++;if(d==c)this._dd=f.Zero._dd;else{this._dd=new Array(c-d);for(var b=0;b<this._dd.length;b++)this._dd[b]=0;for(var a=0;a<this._dd.length;a++)this._dd[a]=e[d+a]}}else this._dd=e;this.__defineGetter__("Zero",function(){return 0==this._dd[0]}),this.__defineGetter__("_ec",function(){return this._dd.length-1}),this.__defineGetter__("Coefficients",function(){return this._dd}),this._ex=function(g){return this._dd[this._dd.length-1-g]},this.evaluateAt=function(h){if(0==h)return this._ex(0);var l=this._dd.length;if(1==h){for(var g=0,k=0;k<l;k++)g=_az._bd(g,this._dd[k]);return g}for(var j=this._dd[0],k=1;k<l;k++)j=_az._bd(this._fa.multiply(h,j),this._dd[k]);return j},this._bd=function(g){if(this._fa!=g._fa)throw"GF256Polys do not have same _az _fa";if(this.Zero)return g;if(g.Zero)return this;var o=this._dd,n=g._dd;if(o.length>n.length){var j=o;o=n,n=j}for(var h=new Array(n.length),k=n.length-o.length,m=0;m<k;m++)h[m]=n[m];for(var l=k;l<n.length;l++)h[l]=_az._bd(o[l-k],n[l]);return new _bp(f,h)},this.multiply1=function(o){if(this._fa!=o._fa)throw"GF256Polys do not have same _az _fa";if(this.Zero||o.Zero)return this._fa.Zero;for(var r=this._dd,g=r.length,l=o._dd,n=l.length,q=new Array(g+n-1),m=0;m<g;m++)for(var h=r[m],k=0;k<n;k++)q[m+k]=_az._bd(q[m+k],this._fa.multiply(h,l[k]));return new _bp(this._fa,q)},this.multiply2=function(g){if(0==g)return this._fa.Zero;if(1==g)return this;for(var j=this._dd.length,k=new Array(j),h=0;h<j;h++)k[h]=this._fa.multiply(this._dd[h],g);return new _bp(this._fa,k)},this._dc=function(l,g){if(l<0)throw"bad arguments";if(0==g)return this._fa.Zero;for(var j=this._dd.length,k=new Array(j+l),h=0;h<k.length;h++)k[h]=0;for(var h=0;h<j;h++)k[h]=this._fa.multiply(this._dd[h],g);return new _bp(this._fa,k)},this.divide=function(l){if(this._fa!=l._fa)throw"GF256Polys do not have same _az _fa";if(l.Zero)throw"Divide by 0";for(var j=this._fa.Zero,o=this,g=l._ex(l._ec),n=this._fa.inverse(g);o._ec>=l._ec&&!o.Zero;){var m=o._ec-l._ec,h=this._fa.multiply(o._ex(o._ec),n),i=l._dc(m,h),k=this._fa._ba(m,h);j=j._bd(k),o=o._bd(i)}return new Array(j,o)}}function _az(b){this._gh=new Array(256),this._gi=new Array(256);for(var a=1,e=0;e<256;e++)this._gh[e]=a,a<<=1,a>=256&&(a^=b);for(var e=0;e<255;e++)this._gi[this._gh[e]]=e;var d=new Array(1);d[0]=0,this.zero=new _bp(this,new Array(d));var c=new Array(1);c[0]=1,this.one=new _bp(this,new Array(c)),this.__defineGetter__("Zero",function(){return this.zero}),this.__defineGetter__("One",function(){return this.one}),this._ba=function(j,f){if(j<0)throw"bad arguments";if(0==f)return zero;for(var h=new Array(j+1),g=0;g<h.length;g++)h[g]=0;return h[0]=f,new _bp(this,h)},this.exp=function(f){return this._gh[f]},this.log=function(f){if(0==f)throw"bad arguments";return this._gi[f]},this.inverse=function(f){if(0==f)throw"System.ArithmeticException";return this._gh[255-this._gi[f]]},this.multiply=function(g,f){return 0==g||0==f?0:1==g?f:1==f?g:this._gh[(this._gi[g]+this._gi[f])%255]}}function _ew(a,b){return a>=0?a>>b:(a>>b)+(2<<~b)}function _cz(c,a,b){this.x=c,this.y=a,this.count=1,this._aj=b,this.__defineGetter__("_ei",function(){return this._aj}),this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("X",function(){return this.x}),this.__defineGetter__("Y",function(){return this.y}),this._ek=function(){this.count++},this._ev=function(f,e,d){if(Math.abs(e-this.y)<=f&&Math.abs(d-this.x)<=f){var g=Math.abs(f-this._aj);return g<=1||g/this._aj<=1}return!1}}function _es(a){this._go=a[0],this._gu=a[1],this._gr=a[2],this.__defineGetter__("_gp",function(){return this._go}),this.__defineGetter__("_gq",function(){return this._gu}),this.__defineGetter__("_gs",function(){return this._gr})}function _cc(){this.image=null,this._cv=[],this._ge=!1,this._al=new Array(0,0,0,0,0),this._am=null,this.__defineGetter__("_da",function(){return this._al[0]=0,this._al[1]=0,this._al[2]=0,this._al[3]=0,this._al[4]=0,this._al}),this._ao=function(f){for(var b=0,d=0;d<5;d++){var e=f[d];if(0==e)return!1;b+=e}if(b<7)return!1;var c=Math.floor((b<<_el)/7),a=Math.floor(c/2);return Math.abs(c-(f[0]<<_el))<a&&Math.abs(c-(f[1]<<_el))<a&&Math.abs(3*c-(f[2]<<_el))<3*a&&Math.abs(c-(f[3]<<_el))<a&&Math.abs(c-(f[4]<<_el))<a},this._an=function(b,a){return a-b[4]-b[3]-b[2]/2},this._ap=function(a,j,d,g){for(var c=this.image,h=qrcode.height,b=this._da,f=a;f>=0&&c[j+f*qrcode.width];)b[2]++,f--;if(f<0)return NaN;for(;f>=0&&!c[j+f*qrcode.width]&&b[1]<=d;)b[1]++,f--;if(f<0||b[1]>d)return NaN;for(;f>=0&&c[j+f*qrcode.width]&&b[0]<=d;)b[0]++,f--;if(b[0]>d)return NaN;for(f=a+1;f<h&&c[j+f*qrcode.width];)b[2]++,f++;if(f==h)return NaN;for(;f<h&&!c[j+f*qrcode.width]&&b[3]<d;)b[3]++,f++;if(f==h||b[3]>=d)return NaN;for(;f<h&&c[j+f*qrcode.width]&&b[4]<d;)b[4]++,f++;if(b[4]>=d)return NaN;var e=b[0]+b[1]+b[2]+b[3]+b[4];return 5*Math.abs(e-g)>=2*g?NaN:this._ao(b)?this._an(b,f):NaN},this._ej=function(b,a,e,h){for(var d=this.image,i=qrcode.width,c=this._da,g=b;g>=0&&d[g+a*qrcode.width];)c[2]++,g--;if(g<0)return NaN;for(;g>=0&&!d[g+a*qrcode.width]&&c[1]<=e;)c[1]++,g--;if(g<0||c[1]>e)return NaN;for(;g>=0&&d[g+a*qrcode.width]&&c[0]<=e;)c[0]++,g--;if(c[0]>e)return NaN;for(g=b+1;g<i&&d[g+a*qrcode.width];)c[2]++,g++;if(g==i)return NaN;for(;g<i&&!d[g+a*qrcode.width]&&c[3]<e;)c[3]++,g++;if(g==i||c[3]>=e)return NaN;for(;g<i&&d[g+a*qrcode.width]&&c[4]<e;)c[4]++,g++;if(c[4]>=e)return NaN;var f=c[0]+c[1]+c[2]+c[3]+c[4];return 5*Math.abs(f-h)>=h?NaN:this._ao(c)?this._an(c,g):NaN},this._cu=function(c,f,e){var d=c[0]+c[1]+c[2]+c[3]+c[4],n=this._an(c,e),b=this._ap(f,Math.floor(n),c[2],d);if(!isNaN(b)&&(n=this._ej(Math.floor(n),Math.floor(b),c[2],d),!isNaN(n))){for(var l=d/7,m=!1,h=this._cv.length,g=0;g<h;g++){var a=this._cv[g];if(a._ev(l,b,n)){a._ek(),m=!0;break}}if(!m){var k=new _cz(n,b,l);this._cv.push(k),null!=this._am&&this._am._ep(k)}return!0}return!1},this._ee=function(){var a=this._cv.length;if(a<3)throw"Couldn't find enough finder patterns";if(a>3){for(var b=0,c=0;c<a;c++)b+=this._cv[c]._ei;for(var d=b/a,c=0;c<this._cv.length&&this._cv.length>3;c++){var e=this._cv[c];Math.abs(e._ei-d)>.2*d&&(this._cv.remove(c),c--)}}return this._cv.length>3&&this._cv.sort(function(g,f){return g.count>f.count?-1:g.count<f.count?1:0}),new Array(this._cv[0],this._cv[1],this._cv[2])},this._eq=function(){var b=this._cv.length;if(b<=1)return 0;for(var c=null,d=0;d<b;d++){var a=this._cv[d];if(a.Count>=_eg){if(null!=c)return this._ge=!0,Math.floor((Math.abs(c.X-a.X)-Math.abs(c.Y-a.Y))/2);c=a}}return 0},this._cx=function(){for(var g=0,c=0,a=this._cv.length,d=0;d<a;d++){var f=this._cv[d];f.Count>=_eg&&(g++,c+=f._ei)}if(g<3)return!1;for(var e=c/a,b=0,d=0;d<a;d++)f=this._cv[d],b+=Math.abs(f._ei-e);return b<=.05*c},this._ce=function(e){var o=!1;this.image=e;var n=qrcode.height,k=qrcode.width,a=Math.floor(3*n/(4*_eh));(a<_gf||o)&&(a=_gf);for(var g=!1,d=new Array(5),h=a-1;h<n&&!g;h+=a){d[0]=0,d[1]=0,d[2]=0,d[3]=0,d[4]=0;for(var b=0,f=0;f<k;f++)if(e[f+h*qrcode.width])1==(1&b)&&b++,d[b]++;else if(0==(1&b))if(4==b)if(this._ao(d)){var c=this._cu(d,h,f);if(c)if(a=2,this._ge)g=this._cx();else{var m=this._eq();m>d[2]&&(h+=m-d[2]-a,f=k-1)}else{do f++;while(f<k&&!e[f+h*qrcode.width]);f--}b=0,d[0]=0,d[1]=0,d[2]=0,d[3]=0,d[4]=0}else d[0]=d[2],d[1]=d[3],d[2]=d[4],d[3]=1,d[4]=0,b=3;else d[++b]++;else d[b]++;if(this._ao(d)){var c=this._cu(d,h,k);c&&(a=d[0],this._ge&&(g=_cx()))}}var l=this._ee();return qrcode._er(l),new _es(l)}}function _ai(c,a,b){this.x=c,this.y=a,this.count=1,this._aj=b,this.__defineGetter__("_ei",function(){return this._aj}),this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("X",function(){return Math.floor(this.x)}),this.__defineGetter__("Y",function(){return Math.floor(this.y)}),this._ek=function(){this.count++},this._ev=function(f,e,d){if(Math.abs(e-this.y)<=f&&Math.abs(d-this.x)<=f){var g=Math.abs(f-this._aj);return g<=1||g/this._aj<=1}return!1}}function _ak(g,c,b,f,a,e,d){this.image=g,this._cv=new Array,this.startX=c,this.startY=b,this.width=f,this.height=a,this._ef=e,this._al=new Array(0,0,0),this._am=d,this._an=function(i,h){return h-i[2]-i[1]/2},this._ao=function(l){for(var k=this._ef,h=k/2,j=0;j<3;j++)if(Math.abs(k-l[j])>=h)return!1;return!0},this._ap=function(h,r,l,o){var k=this.image,q=qrcode.height,j=this._al;j[0]=0,j[1]=0,j[2]=0;for(var n=h;n>=0&&k[r+n*qrcode.width]&&j[1]<=l;)j[1]++,n--;if(n<0||j[1]>l)return NaN;for(;n>=0&&!k[r+n*qrcode.width]&&j[0]<=l;)j[0]++,n--;if(j[0]>l)return NaN;for(n=h+1;n<q&&k[r+n*qrcode.width]&&j[1]<=l;)j[1]++,n++;if(n==q||j[1]>l)return NaN;for(;n<q&&!k[r+n*qrcode.width]&&j[2]<=l;)j[2]++,n++;if(j[2]>l)return NaN;var m=j[0]+j[1]+j[2];return 5*Math.abs(m-o)>=2*o?NaN:this._ao(j)?this._an(j,n):NaN},this._cu=function(l,o,n){var m=l[0]+l[1]+l[2],u=this._an(l,n),k=this._ap(o,Math.floor(u),2*l[1],m);if(!isNaN(k)){for(var t=(l[0]+l[1]+l[2])/3,r=this._cv.length,q=0;q<r;q++){var h=this._cv[q];if(h._ev(t,k,u))return new _ai(u,k,t)}var s=new _ai(u,k,t);this._cv.push(s),null!=this._am&&this._am._ep(s)}return null},this.find=function(){for(var q=this.startX,t=this.height,r=q+f,s=b+(t>>1),m=new Array(0,0,0),k=0;k<t;k++){var o=s+(0==(1&k)?k+1>>1:-(k+1>>1));m[0]=0,m[1]=0,m[2]=0;for(var n=q;n<r&&!g[n+qrcode.width*o];)n++;for(var h=0;n<r;){if(g[n+o*qrcode.width])if(1==h)m[h]++;else if(2==h){if(this._ao(m)){var l=this._cu(m,o,n);if(null!=l)return l}m[0]=m[2],m[1]=1,m[2]=0,h=1}else m[++h]++;else 1==h&&h++,m[h]++;n++}if(this._ao(m)){var l=this._cu(m,o,r);if(null!=l)return l}}if(0!=this._cv.length)return this._cv[0];throw"Couldn't find enough alignment patterns"}}function QRCodeDataBlockReader(c,a,b){this._ed=0,this._cw=7,this.dataLength=0,this.blocks=c,this._en=b,a<=9?this.dataLengthMode=0:a>=10&&a<=26?this.dataLengthMode=1:a>=27&&a<=40&&(this.dataLengthMode=2),this._gd=function(f){var k=0;if(f<this._cw+1){for(var m=0,e=0;e<f;e++)m+=1<<e;return m<<=this._cw-f+1,k=(this.blocks[this._ed]&m)>>this._cw-f+1,this._cw-=f,k}if(f<this._cw+1+8){for(var j=0,e=0;e<this._cw+1;e++)j+=1<<e;return k=(this.blocks[this._ed]&j)<<f-(this._cw+1),this._ed++,k+=this.blocks[this._ed]>>8-(f-(this._cw+1)),this._cw=this._cw-f%8,this._cw<0&&(this._cw=8+this._cw),k}if(f<this._cw+1+16){for(var j=0,h=0,e=0;e<this._cw+1;e++)j+=1<<e;var g=(this.blocks[this._ed]&j)<<f-(this._cw+1);this._ed++;var d=this.blocks[this._ed]<<f-(this._cw+1+8);this._ed++;for(var e=0;e<f-(this._cw+1+8);e++)h+=1<<e;h<<=8-(f-(this._cw+1+8));var l=(this.blocks[this._ed]&h)>>8-(f-(this._cw+1+8));return k=g+d+l,this._cw=this._cw-(f-8)%8,this._cw<0&&(this._cw=8+this._cw),k}return 0},this.NextMode=function(){return this._ed>this.blocks.length-this._en-2?0:this._gd(4)},this.getDataLength=function(d){for(var e=0;;){if(d>>e==1)break;e++}return this._gd(qrcode._eo[this.dataLengthMode][e])},this.getRomanAndFigureString=function(h){var f=h,g=0,j="",d=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":");do if(f>1){g=this._gd(11);var i=Math.floor(g/45),e=g%45;j+=d[i],j+=d[e],f-=2}else 1==f&&(g=this._gd(6),j+=d[g],f-=1);while(f>0);return j},this.getFigureString=function(f){var d=f,e=0,g="";do d>=3?(e=this._gd(10),e<100&&(g+="0"),e<10&&(g+="0"),d-=3):2==d?(e=this._gd(7),e<10&&(g+="0"),d-=2):1==d&&(e=this._gd(4),d-=1),g+=e;while(d>0);return g},this.get8bitByteArray=function(g){var e=g,f=0,d=new Array;do f=this._gd(8),d.push(f),e--;while(e>0);return d},this.getKanjiString=function(j){var g=j,i=0,h="";do{i=_gd(13);var e=i%192,f=i/192,k=(f<<8)+e,d=0;d=k+33088<=40956?k+33088:k+49472,h+=String.fromCharCode(d),g--}while(g>0);return h},this.__defineGetter__("DataByte",function(){for(var g=new Array,e=1,f=2,d=4,n=8;;){var k=this.NextMode();if(0==k){if(g.length>0)break;throw"Empty data block"}if(k!=e&&k!=f&&k!=d&&k!=n)throw"Invalid mode: "+k+" in (block:"+this._ed+" bit:"+this._cw+")";if(dataLength=this.getDataLength(k),dataLength<1)throw"Invalid data length: "+dataLength;switch(k){case e:for(var l=this.getFigureString(dataLength),i=new Array(l.length),h=0;h<l.length;h++)i[h]=l.charCodeAt(h);g.push(i);break;case f:for(var l=this.getRomanAndFigureString(dataLength),i=new Array(l.length),h=0;h<l.length;h++)i[h]=l.charCodeAt(h);g.push(i);break;case d:var m=this.get8bitByteArray(dataLength);g.push(m);break;case n:var l=this.getKanjiString(dataLength);g.push(l)}}return g})}function C_Promise(workload,context){this.parent=context,this.update=null,this.finally=null,this.error_function=null,this.then=function(callback){return this.finally=callback,this},this.progress=function(callback){return this.update=callback,this},this.error=function(callback){return this.error_function=callback,this},this.call_then=function(data){null!==this.finally&&this.finally(data);
},this.call_progress=function(data){null!==this.update&&this.update(data)},this.call_error=function(data){null!==this.error_function&&this.error_function(data)},setTimeout(workload.bind(this),100)}!function(C){function N(a){return function(){var d,b=arguments[0];for(d="["+(a?a+":":"")+b+"] http://errors.angularjs.org/1.5.8/"+(a?a+"/":"")+b,b=1;b<arguments.length;b++){d=d+(1==b?"?":"&")+"p"+(b-1)+"=";var e,c=encodeURIComponent;e=arguments[b],e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e,d+=c(e)}return Error(d)}}function ta(a){if(null==a||Va(a))return!1;if(L(a)||G(a)||F&&a instanceof F)return!0;var b="length"in Object(a)&&a.length;return T(b)&&(0<=b&&(b-1 in a||a instanceof Array)||"function"==typeof a.item)}function q(a,b,d){var c,e;if(a)if(z(a))for(c in a)"prototype"==c||"length"==c||"name"==c||a.hasOwnProperty&&!a.hasOwnProperty(c)||b.call(d,a[c],c,a);else if(L(a)||ta(a)){var f="object"!=typeof a;for(c=0,e=a.length;c<e;c++)(f||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==q)a.forEach(b,d,a);else if(sc(a))for(c in a)b.call(d,a[c],c,a);else if("function"==typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&b.call(d,a[c],c,a);else for(c in a)ua.call(a,c)&&b.call(d,a[c],c,a);return a}function tc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function uc(a){return function(b,d){a(d,b)}}function Yd(){return++pb}function Pb(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=b[e];if(D(g)||z(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var m=h[k],n=g[m];d&&D(n)?da(n)?a[m]=new Date(n.valueOf()):Wa(n)?a[m]=new RegExp(n):n.nodeName?a[m]=n.cloneNode(!0):Qb(n)?a[m]=n.clone():(D(a[m])||(a[m]=L(n)?[]:{}),Pb(a[m],[n],!0)):a[m]=n}}return c?a.$$hashKey=c:delete a.$$hashKey,a}function S(a){return Pb(a,va.call(arguments,1),!1)}function Zd(a){return Pb(a,va.call(arguments,1),!0)}function Z(a){return parseInt(a,10)}function Rb(a,b){return S(Object.create(a),b)}function A(){}function Xa(a){return a}function ha(a){return function(){return a}}function vc(a){return z(a.toString)&&a.toString!==ma}function y(a){return"undefined"==typeof a}function w(a){return"undefined"!=typeof a}function D(a){return null!==a&&"object"==typeof a}function sc(a){return null!==a&&"object"==typeof a&&!wc(a)}function G(a){return"string"==typeof a}function T(a){return"number"==typeof a}function da(a){return"[object Date]"===ma.call(a)}function z(a){return"function"==typeof a}function Wa(a){return"[object RegExp]"===ma.call(a)}function Va(a){return a&&a.window===a}function Ya(a){return a&&a.$evalAsync&&a.$watch}function Ga(a){return"boolean"==typeof a}function $d(a){return a&&T(a.length)&&ae.test(ma.call(a))}function Qb(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function be(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function wa(a){return Q(a.nodeName||a[0]&&a[0].nodeName)}function Za(a,b){var d=a.indexOf(b);return 0<=d&&a.splice(d,1),d}function pa(a,b){function d(a,b){var e,d=b.$$hashKey;if(L(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(sc(a))for(e in a)b[e]=c(a[e]);else if(a&&"function"==typeof a.hasOwnProperty)for(e in a)a.hasOwnProperty(e)&&(b[e]=c(a[e]));else for(e in a)ua.call(a,e)&&(b[e]=c(a[e]));return d?b.$$hashKey=d:delete b.$$hashKey,b}function c(a){if(!D(a))return a;var b=f.indexOf(a);if(-1!==b)return g[b];if(Va(a)||Ya(a))throw xa("cpws");var b=!1,c=e(a);return void 0===c&&(c=L(a)?[]:Object.create(wc(a)),b=!0),f.push(a),g.push(c),b?d(a,c):c}function e(a){switch(ma.call(a)){case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Float32Array]":case"[object Float64Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return new a.constructor(c(a.buffer),a.byteOffset,a.length);case"[object ArrayBuffer]":if(!a.slice){var b=new ArrayBuffer(a.byteLength);return new Uint8Array(b).set(new Uint8Array(a)),b}return a.slice(0);case"[object Boolean]":case"[object Number]":case"[object String]":case"[object Date]":return new a.constructor(a.valueOf());case"[object RegExp]":return b=new RegExp(a.source,a.toString().match(/[^\/]*$/)[0]),b.lastIndex=a.lastIndex,b;case"[object Blob]":return new a.constructor([a],{type:a.type})}if(z(a.cloneNode))return a.cloneNode(!0)}var f=[],g=[];if(b){if($d(b)||"[object ArrayBuffer]"===ma.call(b))throw xa("cpta");if(a===b)throw xa("cpi");return L(b)?b.length=0:q(b,function(a,d){"$$hashKey"!==d&&delete b[d]}),f.push(a),g.push(b),d(a,b)}return c(a)}function na(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var c,d=typeof a;if(d==typeof b&&"object"==d){if(!L(a)){if(da(a))return!!da(b)&&na(a.getTime(),b.getTime());if(Wa(a))return!!Wa(b)&&a.toString()==b.toString();if(Ya(a)||Ya(b)||Va(a)||Va(b)||L(b)||da(b)||Wa(b))return!1;d=U();for(c in a)if("$"!==c.charAt(0)&&!z(a[c])){if(!na(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&w(b[c])&&!z(b[c]))return!1;return!0}if(!L(b))return!1;if((d=a.length)==b.length){for(c=0;c<d;c++)if(!na(a[c],b[c]))return!1;return!0}}return!1}function $a(a,b,d){return a.concat(va.call(b,d))}function ab(a,b){var d=2<arguments.length?va.call(arguments,2):[];return!z(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,$a(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function ce(a,b){var d=b;return"string"==typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=void 0:Va(b)?d="$WINDOW":b&&C.document===b?d="$DOCUMENT":Ya(b)&&(d="$SCOPE"),d}function bb(a,b){if(!y(a))return T(b)||(b=b?2:null),JSON.stringify(a,ce,b)}function xc(a){return G(a)?JSON.parse(a):a}function yc(a,b){a=a.replace(de,"");var d=Date.parse("Jan 01, 1970 00:00:00 "+a)/6e4;return isNaN(d)?b:d}function Sb(a,b,d){d=d?-1:1;var c=a.getTimezoneOffset();return b=yc(b,c),d*=b-c,a=new Date(a.getTime()),a.setMinutes(a.getMinutes()+d),a}function ya(a){a=F(a).clone();try{a.empty()}catch(b){}var d=F("<div>").append(a).html();try{return a[0].nodeType===Ma?Q(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+Q(b)})}catch(c){return Q(d)}}function zc(a){try{return decodeURIComponent(a)}catch(b){}}function Ac(a){var b={};return q((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=zc(e),w(e)&&(f=!w(f)||zc(f),ua.call(b,e)?L(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))}),b}function Tb(a){var b=[];return q(a,function(a,c){L(a)?q(a,function(a){b.push(ea(c,!0)+(!0===a?"":"="+ea(a,!0)))}):b.push(ea(c,!0)+(!0===a?"":"="+ea(a,!0)))}),b.length?b.join("&"):""}function qb(a){return ea(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ea(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function ee(a,b){var d,c,e=Na.length;for(c=0;c<e;++c)if(d=Na[c]+b,G(d=a.getAttribute(d)))return d;return null}function fe(a,b){var d,c,e={};q(Na,function(b){b+="app",!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))}),q(Na,function(b){b+="app";var e;!d&&(e=a.querySelector("["+b.replace(":","\\:")+"]"))&&(d=e,c=e.getAttribute(b))}),d&&(e.strictDi=null!==ee(d,"strict-di"),b(d,c?[c]:[],e))}function Bc(a,b,d){D(d)||(d={}),d=S({strictDi:!1},d);var c=function(){if(a=F(a),a.injector()){var c=a[0]===C.document?"document":ya(a);throw xa("btstrpd",c.replace(/</,"&lt;").replace(/>/,"&gt;"))}return b=b||[],b.unshift(["$provide",function(b){b.value("$rootElement",a)}]),d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]),b.unshift("ng"),c=cb(b,d.strictDi),c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d),c(b)(a)})}]),c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;return C&&e.test(C.name)&&(d.debugInfoEnabled=!0,C.name=C.name.replace(e,"")),C&&!f.test(C.name)?c():(C.name=C.name.replace(f,""),ca.resumeBootstrap=function(a){return q(a,function(a){b.push(a)}),c()},void(z(ca.resumeDeferredBootstrap)&&ca.resumeDeferredBootstrap()))}function ge(){C.name="NG_ENABLE_DEBUG_INFO!"+C.name,C.location.reload()}function he(a){if(a=ca.element(a).injector(),!a)throw xa("test");return a.get("$$testability")}function Cc(a,b){return b=b||"_",a.replace(ie,function(a,c){return(c?b:"")+a.toLowerCase()})}function je(){var a;if(!Dc){var b=rb();(qa=y(b)?C.jQuery:b?C[b]:void 0)&&qa.fn.on?(F=qa,S(qa.fn,{scope:Oa.scope,isolateScope:Oa.isolateScope,controller:Oa.controller,injector:Oa.injector,inheritedData:Oa.inheritedData}),a=qa.cleanData,qa.cleanData=function(b){for(var c,f,e=0;null!=(f=b[e]);e++)(c=qa._data(f,"events"))&&c.$destroy&&qa(f).triggerHandler("$destroy");a(b)}):F=O,ca.element=F,Dc=!0}}function sb(a,b,d){if(!a)throw xa("areq",b||"?",d||"required");return a}function Pa(a,b,d){return d&&L(a)&&(a=a[a.length-1]),sb(z(a),b,"not a function, got "+(a&&"object"==typeof a?a.constructor.name||"Object":typeof a)),a}function Qa(a,b){if("hasOwnProperty"===a)throw xa("badname",b)}function Ec(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g<f;g++)c=b[g],a&&(a=(e=a)[c]);return!d&&z(a)?ab(e,a):a}function tb(a){for(var c,b=a[0],d=a[a.length-1],e=1;b!==d&&(b=b.nextSibling);e++)(c||a[e]!==b)&&(c||(c=F(va.call(a,0,e))),c.push(b));return c||a}function U(){return Object.create(null)}function ke(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=N("$injector"),c=N("ng");return a=b(a,"angular",Object),a.$$minErr=a.$$minErr||N,b(a,"module",function(){var a={};return function(f,g,h){if("hasOwnProperty"===f)throw c("badname","module");return g&&a.hasOwnProperty(f)&&(a[f]=null),b(a,f,function(){function a(b,d,e,f){return f||(f=c),function(){return f[e||"push"]([b,d,arguments]),R}}function b(a,d){return function(b,e){return e&&z(e)&&(e.$$moduleName=f),c.push([a,d,arguments]),R}}if(!g)throw d("nomod",f);var c=[],e=[],p=[],u=a("$injector","invoke","push",e),R={_invokeQueue:c,_configBlocks:e,_runBlocks:p,requires:g,name:f,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),decorator:b("$provide","decorator"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),component:b("$compileProvider","component"),config:u,run:function(a){return p.push(a),this}};return h&&u(h),R})}})}function ia(a,b){if(L(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(D(a))for(d in b=b||{},a)"$"===d.charAt(0)&&"$"===d.charAt(1)||(b[d]=a[d]);return b||a}function le(a){S(a,{bootstrap:Bc,copy:pa,extend:S,merge:Zd,equals:na,element:F,forEach:q,injector:cb,noop:A,bind:ab,toJson:bb,fromJson:xc,identity:Xa,isUndefined:y,isDefined:w,isString:G,isFunction:z,isObject:D,isNumber:T,isElement:Qb,isArray:L,version:me,isDate:da,lowercase:Q,uppercase:ub,callbacks:{$$counter:0},getTestability:he,$$minErr:N,$$csp:Ba,reloadWithDebugInfo:ge}),(Ub=ke(C))("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:ne}),a.provider("$compile",Fc).directive({a:oe,input:Gc,textarea:Gc,form:pe,script:qe,select:re,style:se,option:te,ngBind:ue,ngBindHtml:ve,ngBindTemplate:we,ngClass:xe,ngClassEven:ye,ngClassOdd:ze,ngCloak:Ae,ngController:Be,ngForm:Ce,ngHide:De,ngIf:Ee,ngInclude:Fe,ngInit:Ge,ngNonBindable:He,ngPluralize:Ie,ngRepeat:Je,ngShow:Ke,ngStyle:Le,ngSwitch:Me,ngSwitchWhen:Ne,ngSwitchDefault:Oe,ngOptions:Pe,ngTransclude:Qe,ngModel:Re,ngList:Se,ngChange:Te,pattern:Hc,ngPattern:Hc,required:Ic,ngRequired:Ic,minlength:Jc,ngMinlength:Jc,maxlength:Kc,ngMaxlength:Kc,ngValue:Ue,ngModelOptions:Ve}).directive({ngInclude:We}).directive(vb).directive(Lc),a.provider({$anchorScroll:Xe,$animate:Ye,$animateCss:Ze,$$animateJs:$e,$$animateQueue:af,$$AnimateRunner:bf,$$animateAsyncRun:cf,$browser:df,$cacheFactory:ef,$controller:ff,$document:gf,$exceptionHandler:hf,$filter:Mc,$$forceReflow:jf,$interpolate:kf,$interval:lf,$http:mf,$httpParamSerializer:nf,$httpParamSerializerJQLike:of,$httpBackend:pf,$xhrFactory:qf,$jsonpCallbacks:rf,$location:sf,$log:tf,$parse:uf,$rootScope:vf,$q:wf,$$q:xf,$sce:yf,$sceDelegate:zf,$sniffer:Af,$templateCache:Bf,$templateRequest:Cf,$$testability:Df,$timeout:Ef,$window:Ff,$$rAF:Gf,$$jqLite:Hf,$$HashMap:If,$$cookieReader:Jf})}])}function db(a){return a.replace(Kf,function(a,d,c,e){return e?c.toUpperCase():c}).replace(Lf,"Moz$1")}function Nc(a){return a=a.nodeType,1===a||!a||9===a}function Oc(a,b){var d,c,e=b.createDocumentFragment(),f=[];if(Vb.test(a)){for(d=e.appendChild(b.createElement("div")),c=(Mf.exec(a)||["",""])[1].toLowerCase(),c=ja[c]||ja._default,d.innerHTML=c[1]+a.replace(Nf,"<$1></$2>")+c[2],c=c[0];c--;)d=d.lastChild;f=$a(f,d.childNodes),d=e.firstChild,d.textContent=""}else f.push(b.createTextNode(a));return e.textContent="",e.innerHTML="",q(f,function(a){e.appendChild(a)}),e}function Pc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a),b.appendChild(a)}function O(a){if(a instanceof O)return a;var b;if(G(a)&&(a=W(a),b=!0),!(this instanceof O)){if(b&&"<"!=a.charAt(0))throw Wb("nosel");return new O(a)}if(b){b=C.document;var d;a=(d=Of.exec(a))?[b.createElement(d[1])]:(d=Oc(a,b))?d.childNodes:[]}Qc(this,a)}function Xb(a){return a.cloneNode(!0)}function wb(a,b){if(b||eb(a),a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c<e;c++)eb(d[c])}function Rc(a,b,d,c){if(w(c))throw Wb("offargs");var e=(c=xb(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];w(d)&&Za(c||[],d),w(d)&&c&&0<c.length||(a.removeEventListener(b,f,!1),delete e[b])};q(b.split(" "),function(a){g(a),yb[a]&&g(yb[a])})}else for(b in e)"$destroy"!==b&&a.removeEventListener(b,f,!1),delete e[b]}function eb(a,b){var d=a.ng339,c=d&&fb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),Rc(a)),delete fb[d],a.ng339=void 0))}function xb(a,b){var d=a.ng339,d=d&&fb[d];return b&&!d&&(a.ng339=d=++Pf,d=fb[d]={events:{},data:{},handle:void 0}),d}function Yb(a,b,d){if(Nc(a)){var c=w(d),e=!c&&b&&!D(b),f=!b;if(a=(a=xb(a,!e))&&a.data,c)a[b]=d;else{if(f)return a;if(e)return a&&a[b];S(a,b)}}}function zb(a,b){return!!a.getAttribute&&-1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" ")}function Ab(a,b){b&&a.setAttribute&&q(b.split(" "),function(b){a.setAttribute("class",W((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+W(b)+" "," ")))})}function Bb(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");q(b.split(" "),function(a){a=W(a),-1===d.indexOf(" "+a+" ")&&(d+=a+" ")}),a.setAttribute("class",W(d))}}function Qc(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if("number"==typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function Sc(a,b){return Cb(a,"$"+(b||"ngController")+"Controller")}function Cb(a,b,d){for(9==a.nodeType&&(a=a.documentElement),b=L(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(w(d=F.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function Tc(a){for(wb(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Db(a,b){b||wb(a);var d=a.parentNode;d&&d.removeChild(a)}function Qf(a,b){b=b||C,"complete"===b.document.readyState?b.setTimeout(a):F(b).on("load",a)}function Uc(a,b){var d=Eb[b.toLowerCase()];return d&&Vc[wa(a)]&&d}function Rf(a,b){var d=function(c,d){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=b[d||c.type],g=f?f.length:0;if(g){if(y(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0,c.stopPropagation&&c.stopPropagation(),h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var k=f.specialHandlerWrapper||Sf;1<g&&(f=ia(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,f[l])}};return d.elem=a,d}function Sf(a,b,d){d.call(a,b)}function Tf(a,b,d){var c=b.relatedTarget;c&&(c===a||Uf.call(a,c))||d.call(a,b)}function Hf(){this.$get=function(){return S(O,{hasClass:function(a,b){return a.attr&&(a=a[0]),zb(a,b)},addClass:function(a,b){return a.attr&&(a=a[0]),Bb(a,b)},removeClass:function(a,b){return a.attr&&(a=a[0]),Ab(a,b)}})}}function Ca(a,b){var d=a&&a.$$hashKey;return d?("function"==typeof d&&(d=a.$$hashKey()),d):(d=typeof a,d="function"==d||"object"==d&&null!==a?a.$$hashKey=d+":"+(b||Yd)():d+":"+a)}function Ra(a,b){if(b){var d=0;this.nextUid=function(){return++d}}q(a,this.put,this)}function Wc(a){return a=(Function.prototype.toString.call(a)+" ").replace(Vf,""),a.match(Wf)||a.match(Xf)}function Yf(a){return(a=Wc(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function cb(a,b){function d(a){return function(b,c){return D(b)?void q(b,uc(a)):a(b,c)}}function c(a,b){if(Qa(a,"service"),(z(b)||L(b))&&(b=p.instantiate(b)),!b.$get)throw Ha("pget",a);return n[a+"Provider"]=b}function e(a,b){return function(){var c=B.invoke(b,this);if(y(c))throw Ha("undef",a);return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){sb(y(a)||L(a),"modulesToLoad","not an array");var c,b=[];return q(a,function(a){function d(a){var b,c;for(b=0,c=a.length;b<c;b++){var e=a[b],f=p.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{G(a)?(c=Ub(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):z(a)?b.push(p.invoke(a)):L(a)?b.push(p.invoke(a)):Pa(a,"module")}catch(e){throw L(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ha("modulerr",a,e.stack||e.message||e)}}}),b}function h(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===k)throw Ha("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=c(b,e)}catch(f){throw a[b]===k&&delete a[b],f}finally{l.shift()}}function e(a,c,f){var g=[];a=cb.$$annotate(a,b,f);for(var h=0,k=a.length;h<k;h++){var l=a[h];if("string"!=typeof l)throw Ha("itkn",l);g.push(c&&c.hasOwnProperty(l)?c[l]:d(l,f))}return g}return{invoke:function(a,b,c,d){return"string"==typeof c&&(d=c,c=null),c=e(a,c,d),L(a)&&(a=a[a.length-1]),d=!(11>=Ea)&&("function"==typeof a&&/^(?:class\b|constructor\()/.test(Function.prototype.toString.call(a)+" ")),d?(c.unshift(null),new(Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=L(a)?a[a.length-1]:a;return a=e(a,b,c),a.unshift(null),new(Function.prototype.bind.apply(d,a))},get:d,annotate:cb.$$annotate,has:function(b){return n.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Ra([],!0),n={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,ha(b),!1)}),constant:d(function(a,b){Qa(a,"constant"),n[a]=b,u[a]=b}),decorator:function(a,b){var c=p.get(a+"Provider"),d=c.$get;c.$get=function(){var a=B.invoke(d,c);return B.invoke(b,null,{$delegate:a})}}}},p=n.$injector=h(n,function(a,b){throw ca.isString(b)&&l.push(b),Ha("unpr",l.join(" <- "))}),u={},R=h(u,function(a,b){var c=p.get(a+"Provider",b);return B.invoke(c.$get,c,void 0,a)}),B=R;n.$injectorProvider={$get:ha(R)};var r=g(a),B=R.get("$injector");return B.strictDi=b,q(r,function(a){a&&B.invoke(a)}),B}function Xe(){var a=!0;this.disableAutoScrolling=function(){a=!1},this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;return Array.prototype.some.call(a,function(a){if("a"===wa(a))return b=a,!0}),b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset,z(c)?c=c():Qb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):T(c)||(c=0),c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=G(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;return a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||Qf(function(){c.$evalAsync(g)})}),g}]}function gb(a,b){return a||b?a?b?(L(a)&&(a=a.join(" ")),L(b)&&(b=b.join(" ")),a+" "+b):a:b:""}function Zf(a){G(a)&&(a=a.split(" "));var b=U();return q(a,function(a){a.length&&(b[a]=!0)}),b}function Ia(a){return D(a)?a:{}}function $f(a,b,d,c){function e(a){try{a.apply(null,va.call(arguments,1))}finally{if(R--,0===R)for(;B.length;)try{B.pop()()}catch(b){d.error(b)}}}function f(){t=null,g(),h()}function g(){r=K(),r=y(r)?null:r,na(r,E)&&(r=E),E=r}function h(){v===k.url()&&J===r||(v=k.url(),J=r,q(M,function(a){a(k.url(),r)}))}var k=this,l=a.location,m=a.history,n=a.setTimeout,p=a.clearTimeout,u={};k.isMock=!1;var R=0,B=[];k.$$completeOutstandingRequest=e,k.$$incOutstandingRequestCount=function(){R++},k.notifyWhenNoOutstandingRequests=function(a){0===R?a():B.push(a)};var r,J,v=l.href,fa=b.find("base"),t=null,K=c.history?function(){try{return m.state}catch(a){}}:A;g(),J=r,k.url=function(b,d,e){if(y(e)&&(e=null),l!==a.location&&(l=a.location),m!==a.history&&(m=a.history),b){var f=J===e;if(v===b&&(!c.history||f))return k;var h=v&&Ja(v)===Ja(b);return v=b,J=e,!c.history||h&&f?(h||(t=b),d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b,l.href!==b&&(t=b)):(m[d?"replaceState":"pushState"](e,"",b),g(),J=r),t&&(t=b),k}return t||l.href.replace(/%27/g,"'")},k.state=function(){return r};var M=[],H=!1,E=null;k.onUrlChange=function(b){return H||(c.history&&F(a).on("popstate",f),F(a).on("hashchange",f),H=!0),M.push(b),b},k.$$applicationDestroyed=function(){F(a).off("hashchange popstate",f)},k.$$checkUrlChange=h,k.baseHref=function(){var a=fa.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""},k.defer=function(a,b){var c;return R++,c=n(function(){delete u[c],e(a)},b||0),u[c]=!0,c},k.defer.cancel=function(a){return!!u[a]&&(delete u[a],p(a),e(A),!0)}}function df(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new $f(a,c,b,d)}]}function ef(){this.$get=function(){function a(a,c){function e(a){a!=n&&(p?p==a&&(p=a.n):p=a,f(a.n,a.p),f(a,n),n=a,n.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw N("$cacheFactory")("iid",a);var g=0,h=S({},c,{id:a}),k=U(),l=c&&c.capacity||Number.MAX_VALUE,m=U(),n=null,p=null;return b[a]={put:function(a,b){if(!y(b)){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}return a in k||g++,k[a]=b,g>l&&this.remove(p.key),b}},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return k[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b==n&&(n=b.p),b==p&&(p=b.n),f(b.n,b.p),delete m[a]}a in k&&(delete k[a],g--)},removeAll:function(){k=U(),g=0,m=U(),n=p=null},destroy:function(){m=h=k=null,delete b[a]},info:function(){return S({},h,{size:g})}}}var b={};return a.info=function(){var a={};return q(b,function(b,e){a[e]=b.info()}),a},a.get=function(a){return b[a]},a}}function Bf(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Fc(a,b){function d(a,b,c){var d=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,e=U();return q(a,function(a,f){if(a in n)e[f]=n[a];else{var g=a.match(d);if(!g)throw ga("iscp",b,f,a,c?"controller bindings definition":"isolate scope definition");e[f]={mode:g[1][0],collection:"*"===g[2],optional:"?"===g[3],attrName:g[4]||f},g[4]&&(n[a]=e[f])}}),e}function c(a){var b=a.charAt(0);if(!b||b!==Q(b))throw ga("baddir",a);if(a!==a.trim())throw ga("baddir",a)}function e(a){var b=a.require||a.controller&&a.name;return!L(b)&&D(b)&&q(b,function(a,c){var d=a.match(l);a.substring(d[0].length)||(b[c]=d[0]+c)}),b}var f={},g=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,h=/(([\w\-]+)(?:\:([^;]+))?;?)/,k=be("ngSrc,ngSrcset,src,srcset"),l=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,m=/^(on[a-z]+|formaction)$/,n=U();this.directive=function B(b,d){return Qa(b,"directive"),G(b)?(c(b),sb(d,"directiveFactory"),f.hasOwnProperty(b)||(f[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var d=[];return q(f[b],function(f,g){try{var h=a.invoke(f);z(h)?h={compile:ha(h)}:!h.compile&&h.link&&(h.compile=ha(h.link)),h.priority=h.priority||0,h.index=g,h.name=h.name||b,h.require=e(h),h.restrict=h.restrict||"EA",h.$$moduleName=f.$$moduleName,d.push(h)}catch(k){c(k)}}),d}])),f[b].push(d)):q(b,uc(B)),this},this.component=function(a,b){function c(a){function e(b){return z(b)||L(b)?function(c,d){return a.invoke(b,this,{$element:c,$attrs:d})}:b}var f=b.template||b.templateUrl?b.template:"",g={controller:d,controllerAs:Xc(b.controller)||b.controllerAs||"$ctrl",template:e(f),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E",require:b.require};return q(b,function(a,b){"$"===b.charAt(0)&&(g[b]=a)}),g}var d=b.controller||function(){};return q(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a,z(d)&&(d[b]=a))}),c.$inject=["$injector"],this.directive(a,c)},this.aHrefSanitizationWhitelist=function(a){return w(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(a){return w(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var p=!0;this.debugInfoEnabled=function(a){return w(a)?(p=a,this):p};var u=10;this.onChangesTtl=function(a){return arguments.length?(u=a,this):u},this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(a,b,c,e,n,t,K,M,H,E){function I(){try{if(!--qa)throw Y=void 0,ga("infchng",u);K.$apply(function(){for(var a=[],b=0,c=Y.length;b<c;++b)try{Y[b]()}catch(d){a.push(d)}if(Y=void 0,a.length)throw a})}finally{qa++}}function Da(a,b){if(b){var d,e,f,c=Object.keys(b);for(d=0,e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a}function P(a,b,c){pa.innerHTML="<span "+b+">",b=pa.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name),d.value=c,a.attributes.setNamedItem(d)}function x(a,b){try{a.addClass(b)}catch(c){}}function aa(a,b,c,d,e){a instanceof F||(a=F(a));for(var f=/\S+/,g=0,h=a.length;g<h;g++){var k=a[g];k.nodeType===Ma&&k.nodeValue.match(f)&&Pc(k,a[g]=C.document.createElement("span"))}var l=s(a,b,a,c,d,e);aa.$$addScopeClass(a);var m=null;return function(b,c,d){sb(b,"scope"),e&&e.needsNewScope&&(b=b.$parent.$new()),d=d||{};var f=d.parentBoundTranscludeFn,g=d.transcludeControllers;if(d=d.futureParentElement,f&&f.$$boundTransclude&&(f=f.$$boundTransclude),m||(m=(d=d&&d[0])&&"foreignobject"!==wa(d)&&ma.call(d).match(/SVG/)?"svg":"html"),d="html"!==m?F(da(m,F("<div>").append(a).html())):c?Oa.clone.call(a):a,g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);return aa.$$addScopeInfo(d,b),c&&c(d,b),l&&l(b,d,d,f),d}}function s(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,p,r,v;if(n)for(v=Array(c.length),m=0;m<h.length;m+=3)f=h[m],v[f]=c[f];else v=c;for(m=0,p=h.length;m<p;)k=v[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),aa.$$addScopeInfo(F(k),l)):l=a,r=c.transcludeOnThisElement?za(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?za(a,b):null,c(f,l,k,d,r)):f&&f(a,k.childNodes,void 0,e)}for(var k,l,m,p,n,h=[],r=0;r<a.length;r++)k=new Da,l=$b(a[r],[],k,0===r?d:void 0,e),(f=l.length?oa(l,a[r],k,b,c,null,[],[],f):null)&&f.scope&&aa.$$addScopeClass(k.$$element),k=f&&f.terminal||!(m=a[r].childNodes)||!m.length?null:s(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b),(f||k)&&(h.push(r,f,k),p=!0,n=n||f),f=null;return p?g:null}function za(a,b,c){function d(e,f,g,h,k){return e||(e=a.$new(!1,k),e.$$transcluded=!0),b(e,f,{parentBoundTranscludeFn:c,transcludeControllers:g,futureParentElement:h})}var f,e=d.$$slots=U();for(f in b.$$slots)e[f]=b.$$slots[f]?za(a,b.$$slots[f],c):null;return d}function $b(a,b,c,d,e){var f=c.$attr;switch(a.nodeType){case 1:O(b,Aa(wa(a)),"E",d,e);for(var g,k,l,m,p=a.attributes,n=0,r=p&&p.length;n<r;n++){var v=!1,u=!1;g=p[n],k=g.name,l=W(g.value),g=Aa(k),(m=Ba.test(g))&&(k=k.replace(Yc,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()})),(g=g.match(Ca))&&V(g[1])&&(v=k,u=k.substr(0,k.length-5)+"end",k=k.substr(0,k.length-6)),g=Aa(k.toLowerCase()),f[g]=k,!m&&c.hasOwnProperty(g)||(c[g]=l,Uc(a,g)&&(c[g]=!0)),ia(a,b,l,g,m),O(b,g,"A",d,e,v,u)}if(f=a.className,D(f)&&(f=f.animVal),G(f)&&""!==f)for(;a=h.exec(f);)g=Aa(a[2]),O(b,g,"C",d,e)&&(c[g]=W(a[3])),f=f.substr(a.index+a[0].length);break;case Ma:if(11===Ea)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===Ma;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);ca(b,a.nodeValue);break;case 8:hb(a,b,c,d,e)}return b.sort(Z),b}function hb(a,b,c,d,e){try{var f=g.exec(a.nodeValue);if(f){var h=Aa(f[1]);O(b,h,"M",d,e)&&(c[h]=W(f[2]))}}catch(k){}}function N(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ga("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--),d.push(a),a=a.nextSibling}while(0<e)}else d.push(a);return F(d)}function Zc(a,b,c){return function(d,e,f,g,h){return e=N(e[0],b,c),a(d,e,f,g,h)}}function ac(a,b,c,d,e,f){var g;return a?aa(b,c,d,e,f):function(){return g||(g=aa(b,c,d,e,f),b=c=f=null),g.apply(this,arguments)}}function oa(a,b,d,e,f,g,h,k,l){function m(a,b,c,d){a&&(c&&(a=Zc(a,c,d)),a.require=x.require,a.directiveName=I,(u===x||x.$$isolateScope)&&(a=ja(a,{isolateScope:!0})),h.push(a)),b&&(c&&(b=Zc(b,c,d)),b.require=x.require,b.directiveName=I,(u===x||x.$$isolateScope)&&(b=ja(b,{isolateScope:!0})),k.push(b))}function p(a,e,f,g,l){function m(a,b,c,d){var e;if(Ya(a)||(d=c,c=b,b=a,a=void 0),fa&&(e=t),c||(c=fa?I.parent():I),!d)return l(a,b,e,c,s);var f=l.$$slots[d];if(f)return f(a,b,e,c,s);if(y(f))throw ga("noslot",d,ya(I))}var n,E,x,M,B,t,P,I;b===f?(g=d,I=d.$$element):(I=F(f),g=new Da(I,d)),B=e,u?M=e.$new(!0):r&&(B=e.$parent),l&&(P=m,P.$$boundTransclude=l,P.isSlotFilled=function(a){return!!l.$$slots[a]}),v&&(t=ag(I,g,P,v,M,e,u)),u&&(aa.$$addScopeInfo(I,M,!0,!(H&&(H===u||H===u.$$originalDirective))),aa.$$addScopeClass(I,!0),M.$$isolateBindings=u.$$isolateBindings,E=ka(e,g,M,M.$$isolateBindings,u),E.removeWatches&&M.$on("$destroy",E.removeWatches));for(n in t){E=v[n],x=t[n];var Zb=E.$$bindings.bindToController;x.bindingInfo=x.identifier&&Zb?ka(B,g,x.instance,Zb,E):{};var K=x();K!==x.instance&&(x.instance=K,I.data("$"+E.name+"Controller",K),x.bindingInfo.removeWatches&&x.bindingInfo.removeWatches(),x.bindingInfo=ka(B,g,x.instance,Zb,E))}for(q(v,function(a,b){var c=a.require;a.bindToController&&!L(c)&&D(c)&&S(t[b].instance,ib(b,c,I,t))}),q(t,function(a){var b=a.instance;if(z(b.$onChanges))try{b.$onChanges(a.bindingInfo.initialChanges)}catch(d){c(d)}if(z(b.$onInit))try{b.$onInit()}catch(e){c(e)}z(b.$doCheck)&&(B.$watch(function(){b.$doCheck()}),b.$doCheck()),z(b.$onDestroy)&&B.$on("$destroy",function(){b.$onDestroy()})}),n=0,E=h.length;n<E;n++)x=h[n],la(x,x.isolateScope?M:e,I,g,x.require&&ib(x.directiveName,x.require,I,t),P);var s=e;for(u&&(u.template||null===u.templateUrl)&&(s=M),a&&a(s,f.childNodes,void 0,l),n=k.length-1;0<=n;n--)x=k[n],la(x,x.isolateScope?M:e,I,g,x.require&&ib(x.directiveName,x.require,I,t),P);q(t,function(a){a=a.instance,z(a.$postLink)&&a.$postLink()})}l=l||{};for(var x,I,P,s,w,n=-Number.MAX_VALUE,r=l.newScopeDirective,v=l.controllerDirectives,u=l.newIsolateScopeDirective,H=l.templateDirective,E=l.nonTlbTranscludeDirective,M=!1,B=!1,fa=l.hasElementTranscludeDirective,t=d.$$element=F(b),K=e,Fa=!1,za=!1,A=0,C=a.length;A<C;A++){x=a[A];var G=x.$$start,hb=x.$$end;if(G&&(t=N(b,G,hb)),P=void 0,n>x.priority)break;if((w=x.scope)&&(x.templateUrl||(D(w)?(X("new/isolated scope",u||r,x,t),u=x):X("new/isolated scope",u,x,t)),r=r||x),I=x.name,!Fa&&(x.replace&&(x.templateUrl||x.template)||x.transclude&&!x.$$tlb)){for(w=A+1;Fa=a[w++];)if(Fa.transclude&&!Fa.$$tlb||Fa.replace&&(Fa.templateUrl||Fa.template)){za=!0;break}Fa=!0}if(!x.templateUrl&&x.controller&&(w=x.controller,
v=v||U(),X("'"+I+"' controller",v[I],x,t),v[I]=x),w=x.transclude)if(M=!0,x.$$tlb||(X("transclusion",E,x,t),E=x),"element"==w)fa=!0,n=x.priority,P=t,t=d.$$element=F(aa.$$createComment(I,d[I])),b=t[0],ea(f,va.call(P,0),b),P[0].$$parentNode=P[0].parentNode,K=ac(za,P,e,n,g&&g.name,{nonTlbTranscludeDirective:E});else{var oa=U();if(P=F(Xb(b)).contents(),D(w)){P=[];var Q=U(),O=U();q(w,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a,Q[a]=b,oa[b]=null,O[b]=c}),q(t.contents(),function(a){var b=Q[Aa(wa(a))];b?(O[b]=!0,oa[b]=oa[b]||[],oa[b].push(a)):P.push(a)}),q(O,function(a,b){if(!a)throw ga("reqslot",b)});for(var V in oa)oa[V]&&(oa[V]=ac(za,oa[V],e))}t.empty(),K=ac(za,P,e,void 0,void 0,{needsNewScope:x.$$isolateScope||x.$$newScope}),K.$$slots=oa}if(x.template)if(B=!0,X("template",H,x,t),H=x,w=z(x.template)?x.template(t,d):x.template,w=xa(w),x.replace){if(g=x,P=Vb.test(w)?$c(da(x.templateNamespace,W(w))):[],b=P[0],1!=P.length||1!==b.nodeType)throw ga("tplrt",I,"");ea(f,t,b),C={$attr:{}},w=$b(b,[],C);var Z=a.splice(A+1,a.length-(A+1));(u||r)&&T(w,u,r),a=a.concat(w).concat(Z),$(d,C),C=a.length}else t.html(w);if(x.templateUrl)B=!0,X("template",H,x,t),H=x,x.replace&&(g=x),p=ba(a.splice(A,a.length-A),t,d,f,M&&K,h,k,{controllerDirectives:v,newScopeDirective:r!==x&&r,newIsolateScopeDirective:u,templateDirective:H,nonTlbTranscludeDirective:E}),C=a.length;else if(x.compile)try{s=x.compile(t,d,K);var Y=x.$$originalDirective||x;z(s)?m(null,ab(Y,s),G,hb):s&&m(ab(Y,s.pre),ab(Y,s.post),G,hb)}catch(ca){c(ca,ya(t))}x.terminal&&(p.terminal=!0,n=Math.max(n,x.priority))}return p.scope=r&&!0===r.scope,p.transcludeOnThisElement=M,p.templateOnThisElement=B,p.transclude=K,l.hasElementTranscludeDirective=fa,p}function ib(a,b,c,d){var e;if(G(b)){var f=b.match(l);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];if("^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance,!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw ga("ctreq",b,a)}else if(L(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=ib(a,b[g],c,d);else D(b)&&(e={},q(b,function(b,f){e[f]=ib(a,b,c,d)}));return e||null}function ag(a,b,c,d,e,f,g){var k,h=U();for(k in d){var l=d[k],m={$scope:l===g||l.$$isolateScope?e:f,$element:a,$attrs:b,$transclude:c},p=l.controller;"@"==p&&(p=b[l.name]),m=t(p,m,!0,l.controllerAs),h[l.name]=m,a.data("$"+l.name+"Controller",m.instance)}return h}function T(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Rb(a[d],{$$isolateScope:b,$$newScope:c})}function O(b,e,g,h,k,l,m){if(e===k)return null;if(k=null,f.hasOwnProperty(e)){var p;e=a.get(e+"Directive");for(var n=0,r=e.length;n<r;n++)try{if(p=e[n],(y(h)||h>p.priority)&&-1!=p.restrict.indexOf(g)){if(l&&(p=Rb(p,{$$start:l,$$end:m})),!p.$$bindings){var u=p,v=p,x=p.name,H={isolateScope:null,bindToController:null};if(D(v.scope)&&(!0===v.bindToController?(H.bindToController=d(v.scope,x,!0),H.isolateScope={}):H.isolateScope=d(v.scope,x,!1)),D(v.bindToController)&&(H.bindToController=d(v.bindToController,x,!0)),D(H.bindToController)){var E=v.controller,M=v.controllerAs;if(!E)throw ga("noctrl",x);if(!Xc(E,M))throw ga("noident",x)}var t=u.$$bindings=H;D(t.isolateScope)&&(p.$$isolateBindings=t.isolateScope)}b.push(p),k=p}}catch(I){c(I)}}return k}function V(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d<e;d++)if(b=c[d],b.multiElement)return!0;return!1}function $(a,b){var c=b.$attr,d=a.$attr;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))}),q(b,function(b,e){a.hasOwnProperty(e)||"$"===e.charAt(0)||(a[e]=b,"class"!==e&&"style"!==e&&(d[e]=c[e]))})}function ba(a,b,c,d,f,g,h,k){var m,p,l=[],n=b[0],r=a.shift(),u=Rb(r,{templateUrl:null,transclude:null,replace:null,$$originalDirective:r}),H=z(r.templateUrl)?r.templateUrl(b,c):r.templateUrl,E=r.templateNamespace;return b.empty(),e(H).then(function(e){var v,M;if(e=xa(e),r.replace){if(e=Vb.test(e)?$c(da(E,W(e))):[],v=e[0],1!=e.length||1!==v.nodeType)throw ga("tplrt",r.name,H);e={$attr:{}},ea(d,b,v);var B=$b(v,[],e);D(r.scope)&&T(B,!0),a=B.concat(a),$(c,e)}else v=n,b.html(e);for(a.unshift(u),m=oa(a,v,c,f,b,r,g,h,k),q(d,function(a,c){a==v&&(d[c]=b[0])}),p=s(b[0].childNodes,f);l.length;){e=l.shift(),M=l.shift();var t=l.shift(),I=l.shift(),B=b[0];if(!e.$$destroyed){if(M!==n){var P=M.className;k.hasElementTranscludeDirective&&r.replace||(B=Xb(v)),ea(t,F(M),B),x(F(B),P)}M=m.transcludeOnThisElement?za(e,m.transclude,I):I,m(p,e,B,d,M)}}l=null}),function(a,b,c,d,e){a=e,b.$$destroyed||(l?l.push(b,c,d,a):(m.transcludeOnThisElement&&(a=za(b,m.transclude,e)),m(p,b,c,d,a)))}}function Z(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function X(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw ga("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,ya(d))}function ca(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;return b&&aa.$$addBindingClass(a),function(a,c){var e=c.parent();b||aa.$$addBindingClass(e),aa.$$addBindingInfo(e,d.expressions),a.$watch(d,function(a){c[0].nodeValue=a})}}})}function da(a,b){switch(a=Q(a||"html")){case"svg":case"math":var c=C.document.createElement("div");return c.innerHTML="<"+a+">"+b+"</"+a+">",c.childNodes[0].childNodes;default:return b}}function ha(a,b){if("srcdoc"==b)return M.HTML;var c=wa(a);return"xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b)?M.RESOURCE_URL:void 0}function ia(a,c,d,e,f){var g=ha(a,e);f=k[e]||f;var h=b(d,!0,g,f);if(h){if("multiple"===e&&"select"===wa(a))throw ga("selmulti",ya(a));c.push({priority:100,compile:function(){return{pre:function(a,c,k){if(c=k.$$observers||(k.$$observers=U()),m.test(e))throw ga("nodomevents");var l=k[e];l!==d&&(h=l&&b(l,!0,g,f),d=l),h&&(k[e]=h(a),(c[e]||(c[e]=[])).$$inter=!0,(k.$$observers&&k.$$observers[e].$$scope||a).$watch(h,function(a,b){"class"===e&&a!=b?k.$updateClass(a,b):k.$set(e,a)}))}}}})}}function ea(a,b,c){var g,h,d=b[0],e=b.length,f=d.parentNode;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c,h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1,a.context===d&&(a.context=c);break}for(f&&f.replaceChild(c,d),a=C.document.createDocumentFragment(),g=0;g<e;g++)a.appendChild(b[g]);for(F.hasData(d)&&(F.data(c,F.data(d)),F(d).off("$destroy")),F.cleanData(a.querySelectorAll("*")),g=1;g<e;g++)delete b[g];b[0]=c,b.length=1}function ja(a,b){return S(function(){return a.apply(null,arguments)},a,b)}function la(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,ya(d))}}function ka(a,c,d,e,f){function g(b,c,e){z(d.$onChanges)&&c!==e&&(Y||(a.$$postDigest(I),Y=[]),m||(m={},Y.push(h)),m[b]&&(e=m[b].previousValue),m[b]=new Fb(e,c))}function h(){d.$onChanges(m),m=void 0}var m,k=[],l={};return q(e,function(e,h){var v,u,x,H,m=e.attrName,p=e.optional;switch(e.mode){case"@":p||ua.call(c,m)||(d[h]=c[m]=void 0),c.$observe(m,function(a){(G(a)||Ga(a))&&(g(h,a,d[h]),d[h]=a)}),c.$$observers[m].$$scope=a,v=c[m],G(v)?d[h]=b(v)(a):Ga(v)&&(d[h]=v),l[h]=new Fb(bc,d[h]);break;case"=":if(!ua.call(c,m)){if(p)break;c[m]=void 0}if(p&&!c[m])break;u=n(c[m]),H=u.literal?na:function(a,b){return a===b||a!==a&&b!==b},x=u.assign||function(){throw v=d[h]=u(a),ga("nonassign",c[m],m,f.name)},v=d[h]=u(a),p=function(b){return H(b,d[h])||(H(b,v)?x(a,b=d[h]):d[h]=b),v=b},p.$stateful=!0,p=e.collection?a.$watchCollection(c[m],p):a.$watch(n(c[m],p),null,u.literal),k.push(p);break;case"<":if(!ua.call(c,m)){if(p)break;c[m]=void 0}if(p&&!c[m])break;u=n(c[m]);var E=d[h]=u(a);l[h]=new Fb(bc,d[h]),p=a.$watch(u,function(a,b){if(b===a){if(b===E)return;b=E}g(h,a,b),d[h]=a},u.literal),k.push(p);break;case"&":if(u=c.hasOwnProperty(m)?n(c[m]):A,u===A&&p)break;d[h]=function(b){return u(a,b)}}}),{initialChanges:l,removeWatches:k.length&&function(){for(var a=0,b=k.length;a<b;++a)k[a]()}}}var Y,ta=/^\w/,pa=C.document.createElement("div"),qa=u;Da.prototype={$normalize:Aa,$addClass:function(a){a&&0<a.length&&H.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&H.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=ad(a,b);c&&c.length&&H.addClass(this.$$element,c),(c=ad(b,a))&&c.length&&H.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=Uc(this.$$element[0],a),g=bd[a],h=a;if(f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g),this[a]=b,e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=Cc(a,"-")),f=wa(this.$$element),"a"===f&&("href"===a||"xlinkHref"===a)||"img"===f&&"src"===a)this[a]=b=E(b,"src"===a);else if("img"===f&&"srcset"===a&&w(b)){for(var f="",g=W(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(g)?k:/(,)/,g=g.split(k),k=Math.floor(g.length/2),l=0;l<k;l++)var m=2*l,f=f+E(W(g[m]),!0),f=f+(" "+W(g[m+1]));g=W(g[2*l]).split(/\s/),f+=E(W(g[0]),!0),2===g.length&&(f+=" "+W(g[1])),this[a]=b=f}!1!==d&&(null===b||y(b)?this.$$element.removeAttr(e):ta.test(e)?this.$$element.attr(e,b):P(this.$$element[0],e,b)),(a=this.$$observers)&&q(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=U()),e=d[a]||(d[a]=[]);return e.push(b),K.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||y(c[a])||b(c[a])}),function(){Za(e,b)}}};var ra=b.startSymbol(),sa=b.endSymbol(),xa="{{"==ra&&"}}"==sa?Xa:function(a){return a.replace(/\{\{/g,ra).replace(/}}/g,sa)},Ba=/^ngAttr[A-Z]/,Ca=/^(.+)Start$/;return aa.$$addBindingInfo=p?function(a,b){var c=a.data("$binding")||[];L(b)?c=c.concat(b):c.push(b),a.data("$binding",c)}:A,aa.$$addBindingClass=p?function(a){x(a,"ng-binding")}:A,aa.$$addScopeInfo=p?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:A,aa.$$addScopeClass=p?function(a,b){x(a,b?"ng-isolate-scope":"ng-scope")}:A,aa.$$createComment=function(a,b){var c="";return p&&(c=" "+(a||"")+": ",b&&(c+=b+" ")),C.document.createComment(c)},aa}]}function Fb(a,b){this.previousValue=a,this.currentValue=b}function Aa(a){return db(a.replace(Yc,""))}function ad(a,b){var d="",c=a.split(/\s+/),e=b.split(/\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],h=0;h<e.length;h++)if(g==e[h])continue a;d+=(0<d.length?" ":"")+g}return d}function $c(a){a=F(a);var b=a.length;if(1>=b)return a;for(;b--;)8===a[b].nodeType&&bg.call(a,b,1);return a}function Xc(a,b){if(b&&G(b))return b;if(G(a)){var d=cd.exec(a);if(d)return d[3]}}function ff(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)},this.register=function(b,c){Qa(b,"controller"),D(b)?S(a,b):a[b]=c},this.allowGlobals=function(){b=!0},this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!D(a.$scope))throw N("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,n;if(h=!0===h,k&&G(k)&&(n=k),G(f)){if(k=f.match(cd),!k)throw cg("ctrlfmt",f);m=k[1],n=n||k[3],f=a.hasOwnProperty(m)?a[m]:Ec(g.$scope,m,!0)||(b?Ec(c,m,!0):void 0),Pa(f,m,!0)}return h?(h=(L(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),n&&e(g,n,l,m||f.name),S(function(){var a=d.invoke(f,l,g,m);return a!==l&&(D(a)||z(a))&&(l=a,n&&e(g,n,l,m||f.name)),l},{instance:l,identifier:n})):(l=d.instantiate(f,g,m),n&&e(g,n,l,m||f.name),l)}}]}function gf(){this.$get=["$window",function(a){return F(a.document)}]}function hf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function cc(a){return D(a)?da(a)?a.toISOString():bb(a):a}function nf(){this.$get=function(){return function(a){if(!a)return"";var b=[];return tc(a,function(a,c){null===a||y(a)||(L(a)?q(a,function(a){b.push(ea(c)+"="+ea(cc(a)))}):b.push(ea(c)+"="+ea(cc(a))))}),b.join("&")}}}function of(){this.$get=function(){return function(a){function b(a,e,f){null===a||y(a)||(L(a)?q(a,function(a,c){b(a,e+"["+(D(a)?c:"")+"]")}):D(a)&&!da(a)?tc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ea(e)+"="+ea(cc(a))))}if(!a)return"";var d=[];return b(a,"",!0),d.join("&")}}}function dc(a,b){if(G(a)){var d=a.replace(dg,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(dd))||(c=(c=d.match(eg))&&fg[c[0]].test(d)),c&&(a=xc(d))}}return a}function ed(a){var d,b=U();return G(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var e=Q(W(a.substr(0,d)));a=W(a.substr(d+1)),e&&(b[e]=b[e]?b[e]+", "+a:a)}):D(a)&&q(a,function(a,d){var f=Q(d),g=W(a);f&&(b[f]=b[f]?b[f]+", "+g:g)}),b}function fd(a){var b;return function(d){return b||(b=ed(a)),d?(d=b[Q(d)],void 0===d&&(d=null),d):b}}function gd(a,b,d,c){return z(c)?c(a,b,d):(q(c,function(c){a=c(a,b,d)}),a)}function mf(){var a=this.defaults={transformResponse:[dc],transformRequest:[function(a){return D(a)&&"[object File]"!==ma.call(a)&&"[object Blob]"!==ma.call(a)&&"[object FormData]"!==ma.call(a)?bb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ia(ec),put:ia(ec),patch:ia(ec)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return w(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return w(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,k,l){function m(b){function c(a,b){for(var d=0,e=b.length;d<e;){var f=b[d++],g=b[d++];a=a.then(f,g)}return b.length=0,a}function e(a,b){var c,d={};return q(a,function(a,e){z(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a}),d}function f(a){var b=S({},a);return b.data=gd(a.data,a.headers,a.status,g.transformResponse),a=a.status,200<=a&&300>a?b:k.reject(b)}if(!D(b))throw N("$http")("badreq",b);if(!G(b.url))throw N("$http")("badreq",b.url);var g=S({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);g.headers=function(b){var f,g,h,c=a.headers,d=S({},b.headers),c=S({},c.common,c[Q(b.method)]);a:for(f in c){g=Q(f);for(h in d)if(Q(h)===g)continue a;d[f]=c[f]}return e(d,ia(b))}(b),g.method=ub(g.method),g.paramSerializer=G(g.paramSerializer)?l.get(g.paramSerializer):g.paramSerializer;var h=[],m=[],p=k.when(g);return q(R,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError),(a.response||a.responseError)&&m.push(a.response,a.responseError)}),p=c(p,h),p=p.then(function(b){var c=b.headers,d=gd(b.data,fd(c),void 0,b.transformRequest);return y(d)&&q(c,function(a,b){"content-type"===Q(b)&&delete c[b]}),y(b.withCredentials)&&!y(a.withCredentials)&&(b.withCredentials=a.withCredentials),n(b,d).then(f,f)}),p=c(p,m),d?(p.success=function(a){return Pa(a,"fn"),p.then(function(b){a(b.data,b.status,b.headers,g)}),p},p.error=function(a){return Pa(a,"fn"),p.then(null,function(b){a(b.data,b.status,b.headers,g)}),p}):(p.success=hd("success"),p.error=hd("error")),p}function n(c,d){function g(a){if(a){var c={};return q(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}}),c}}function l(a,c,d,e){function f(){n(c,a,d,e)}E&&(200<=a&&300>a?E.put(P,[a,c,ed(d),e]):E.remove(P)),b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function n(a,b,d,e){b=-1<=b?b:0,(200<=b&&300>b?M.resolve:M.reject)({data:a,status:b,headers:fd(d),config:c,statusText:e})}function t(a){n(a.data,a.status,ia(a.headers()),a.statusText)}function R(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var E,I,M=k.defer(),H=M.promise,Da=c.headers,P=p(c.url,c.paramSerializer(c.params));return m.pendingRequests.push(c),H.then(R,R),!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(E=D(c.cache)?c.cache:D(a.cache)?a.cache:u),E&&(I=E.get(P),w(I)?I&&z(I.then)?I.then(t,t):L(I)?n(I[1],I[0],ia(I[2]),I[3]):n(I,200,{},"OK"):E.put(P,H)),y(I)&&((I=id(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(Da[c.xsrfHeaderName||a.xsrfHeaderName]=I),e(c.method,P,d,l,Da,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers))),H}function p(a,b){return 0<b.length&&(a+=(-1==a.indexOf("?")?"?":"&")+b),a}var u=g("$http");a.paramSerializer=G(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var R=[];return q(c,function(a){R.unshift(G(a)?l.get(a):l.invoke(a))}),m.pendingRequests=[],function(a){q(arguments,function(a){m[a]=function(b,c){return m(S({},c||{},{method:a,url:b}))}})}("get","delete","head","jsonp"),function(a){q(arguments,function(a){m[a]=function(b,c,d){return m(S({},d||{},{method:a,url:b,data:c}))}})}("post","put","patch"),m.defaults=a,m}]}function qf(){this.$get=function(){return function(){return new C.XMLHttpRequest}}}function pf(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(a,b,d,c){return gg(a,c,a.defer,b,d[0])}]}function gg(a,b,d,c,e){function f(a,b,d){a=a.replace("JSON_CALLBACK",b);var f=e.createElement("script"),m=null;return f.type="text/javascript",f.src=a,f.async=!0,m=function(a){f.removeEventListener("load",m,!1),f.removeEventListener("error",m,!1),e.body.removeChild(f),f=null;var g=-1,u="unknown";a&&("load"!==a.type||c.wasCalled(b)||(a={type:"error"}),u=a.type,g="error"===a.type?404:200),d&&d(g,u)},f.addEventListener("load",m,!1),f.addEventListener("error",m,!1),e.body.appendChild(f),m}return function(e,h,k,l,m,n,p,u,R,B){function r(){fa&&fa(),t&&t.abort()}function J(b,c,e,f,g){w(M)&&d.cancel(M),fa=t=null,b(c,e,f,g),a.$$completeOutstandingRequest(A)}if(a.$$incOutstandingRequestCount(),h=h||a.url(),"jsonp"===Q(e))var v=c.createCallback(h),fa=f(h,v,function(a,b){var d=200===a&&c.getResponse(v);J(l,a,d,"",b),c.removeCallback(v)});else{var t=b(e,h);if(t.open(e,h,!0),q(m,function(a,b){w(a)&&t.setRequestHeader(b,a)}),t.onload=function(){var a=t.statusText||"",b="response"in t?t.response:t.responseText,c=1223===t.status?204:t.status;0===c&&(c=b?200:"file"==Y(h).protocol?404:0),J(l,c,b,t.getAllResponseHeaders(),a)},e=function(){J(l,-1,null,null,"")},t.onerror=e,t.onabort=e,q(R,function(a,b){t.addEventListener(b,a)}),q(B,function(a,b){t.upload.addEventListener(b,a)}),p&&(t.withCredentials=!0),u)try{t.responseType=u}catch(K){if("json"!==u)throw K}t.send(y(k)?null:k)}if(0<n)var M=d(r,n);else n&&z(n.then)&&n.then(r)}}function kf(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a},this.endSymbol=function(a){return a?(b=a,this):b},this.$get=["$parse","$exceptionHandler","$sce",function(d,c,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(n,a).replace(p,b)}function h(a,b,c,d){var e;return e=a.$watch(function(a){return e(),d(a)},b,c)}function k(f,k,p,n){function J(a){try{var b=a;a=p?e.getTrusted(p,b):e.valueOf(b);var d;if(n&&!w(a))d=a;else if(null==a)d="";else{switch(typeof a){case"string":break;case"number":a=""+a;break;default:a=bb(a)}d=a}return d}catch(g){c(Ka.interr(f,g))}}if(!f.length||-1===f.indexOf(a)){var v;return k||(k=g(f),v=ha(k),v.exp=f,v.expressions=[],v.$$watchDelegate=h),v}n=!!n;var q,t,K=0,M=[],H=[];v=f.length;for(var E=[],I=[];K<v;){if(-1==(q=f.indexOf(a,K))||-1==(t=f.indexOf(b,q+l))){K!==v&&E.push(g(f.substring(K)));break}K!==q&&E.push(g(f.substring(K,q))),K=f.substring(q+l,t),M.push(K),H.push(d(K,J)),K=t+m,I.push(E.length),E.push("")}if(p&&1<E.length&&Ka.throwNoconcat(f),!k||M.length){var Da=function(a){for(var b=0,c=M.length;b<c;b++){if(n&&y(a[b]))return;E[I[b]]=a[b]}return E.join("")};return S(function(a){var b=0,d=M.length,e=Array(d);try{for(;b<d;b++)e[b]=H[b](a);return Da(e)}catch(g){c(Ka.interr(f,g))}},{exp:f,expressions:M,$$watchDelegate:function(a,b){var c;return a.$watchGroup(H,function(d,e){var f=Da(d);z(b)&&b.call(this,f,d!==e?c:f,a),c=f})}})}}var l=a.length,m=b.length,n=new RegExp(a.replace(/./g,f),"g"),p=new RegExp(b.replace(/./g,f),"g");return k.startSymbol=function(){return a},k.endSymbol=function(){return b},k}]}function lf(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(a,b,d,c,e){function f(f,k,l,m){function n(){p?f.apply(null,u):f(r)}var p=4<arguments.length,u=p?va.call(arguments,4):[],R=b.setInterval,q=b.clearInterval,r=0,J=w(m)&&!m,v=(J?c:d).defer(),fa=v.promise;return l=w(l)?l:0,fa.$$intervalId=R(function(){J?e.defer(n):a.$evalAsync(n),v.notify(r++),0<l&&r>=l&&(v.resolve(r),q(fa.$$intervalId),delete g[fa.$$intervalId]),J||a.$apply()},k),g[fa.$$intervalId]=v,fa}var g={};return f.cancel=function(a){return!!(a&&a.$$intervalId in g)&&(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0)},f}]}function fc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=qb(a[b]);return a.join("/")}function jd(a,b){var d=Y(a);b.$$protocol=d.protocol,b.$$host=d.hostname,b.$$port=Z(d.port)||hg[d.protocol]||null}function kd(a,b){var d="/"!==a.charAt(0);d&&(a="/"+a);var c=Y(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname),b.$$search=Ac(c.search),b.$$hash=decodeURIComponent(c.hash),b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function ka(a,b){if(0===b.lastIndexOf(a,0))return b.substr(a.length)}function Ja(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function jb(a){return a.replace(/(#.+)|#$/,"$1")}function gc(a,b,d){this.$$html5=!0,d=d||"",jd(a,this),this.$$parse=function(a){var d=ka(b,a);if(!G(d))throw Gb("ipthprfx",a,b);kd(d,this),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var a=Tb(this.$$search),d=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(a?"?"+a:"")+d,this.$$absUrl=b+this.$$url.substr(1)},this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;return w(f=ka(a,c))?(g=f,g=w(f=ka(d,f))?b+(ka("/",f)||f):a+g):w(f=ka(b,c))?g=b+f:b==c+"/"&&(g=b),g&&this.$$parse(g),!!g}}function hc(a,b,d){jd(a,this),this.$$parse=function(c){var f,e=ka(a,c)||ka(b,c);y(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",y(e)&&(a=c,this.replace())):(f=ka(d,e),y(f)&&(f=e)),kd(f,this),c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.lastIndexOf(e,0)&&(f=f.replace(e,"")),g.exec(f)||(c=(f=g.exec(c))?f[1]:c),this.$$path=c,this.$$compose()},this.$$compose=function(){var b=Tb(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(b?"?"+b:"")+e,this.$$absUrl=a+(this.$$url?d+this.$$url:"")},this.$$parseLinkUrl=function(b,d){return Ja(a)==Ja(b)&&(this.$$parse(b),!0)}}function ld(a,b,d){this.$$html5=!0,hc.apply(this,arguments),this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;return a==Ja(c)?f=c:(g=ka(b,c))?f=a+d+g:b===c+"/"&&(f=b),f&&this.$$parse(f),!!f},this.$$compose=function(){var b=Tb(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(b?"?"+b:"")+e,this.$$absUrl=a+d+this.$$url}}function Hb(a){return function(){return this[a]}}function md(a,b){return function(d){return y(d)?this[a]:(this[a]=b(d),this.$$compose(),this)}}function sf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return w(b)?(a=b,this):a},this.html5Mode=function(a){return Ga(a)?(b.enabled=a,this):D(a)?(Ga(a.enabled)&&(b.enabled=a.enabled),Ga(a.requireBase)&&(b.requireBase=a.requireBase),Ga(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b},this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var p,n=c.url();if(b.enabled){if(!m&&b.requireBase)throw Gb("nobase");p=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(m||"/"),m=e.history?gc:ld}else p=Ja(n),m=hc;var u=p.substr(0,Ja(p).lastIndexOf("/")+1);l=new m(p,u,"#"+a),l.$$parseLinkUrl(n,n),l.$$state=c.state();var R=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=F(a.target);"a"!==wa(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");D(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=Y(h.animVal).href),R.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=!0))}}),jb(l.absUrl())!=jb(n)&&c.url(l.absUrl(),!0);var q=!0;return c.onUrlChange(function(a,b){y(ka(u,a))?g.location.href=a:(d.$evalAsync(function(){var f,c=l.absUrl(),e=l.$$state;a=jb(a),l.$$parse(a),l.$$state=b,f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented,l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(q=!1,k(c,e)))}),d.$$phase||d.$digest())}),d.$watch(function(){var a=jb(c.url()),b=jb(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;(q||m)&&(q=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))})),l.$$replace=!1}),l}]}function tf(){var a=!0,b=this;this.debugEnabled=function(b){return w(b)?(a=b,this):a},this.$get=["$window",function(d){function c(a){return a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line)),a}function e(a){var b=d.console||{},e=b[a]||b.log||A;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];return q(arguments,function(b){a.push(c(b))}),e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Sa(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===a||"__proto__"===a)throw X("isecfld",b);return a}function ig(a){return a+""}function ra(a,b){if(a){if(a.constructor===a)throw X("isecfn",b);if(a.window===a)throw X("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw X("isecdom",b);if(a===Object)throw X("isecobj",b)}return a}function nd(a,b){if(a){if(a.constructor===a)throw X("isecfn",b);if(a===jg||a===kg||a===lg)throw X("isecff",b)}}function Ib(a,b){if(a&&(a===(0).constructor||a===(!1).constructor||a==="".constructor||a==={}.constructor||a===[].constructor||a===Function.constructor))throw X("isecaf",b)}function mg(a,b){return"undefined"!=typeof a?a:b}function od(a,b){return"undefined"==typeof a?b:"undefined"==typeof b?a:a+b}function V(a,b){var d,c;switch(a.type){case s.Program:d=!0,q(a.body,function(a){V(a.expression,b),d=d&&a.expression.constant}),a.constant=d;break;case s.Literal:a.constant=!0,a.toWatch=[];break;case s.UnaryExpression:V(a.argument,b),a.constant=a.argument.constant,a.toWatch=a.argument.toWatch;break;case s.BinaryExpression:V(a.left,b),V(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:V(a.left,b),V(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:V(a.test,b),V(a.alternate,b),V(a.consequent,b),a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant,a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant=!1,a.toWatch=[a];break;case s.MemberExpression:V(a.object,b),a.computed&&V(a.property,b),a.constant=a.object.constant&&(!a.computed||a.property.constant),a.toWatch=[a];break;case s.CallExpression:d=!!a.filter&&!b(a.callee.name).$stateful,c=[],q(a.arguments,function(a){V(a,b),d=d&&a.constant,a.constant||c.push.apply(c,a.toWatch)}),a.constant=d,a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:V(a.left,b),V(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=[a];break;case s.ArrayExpression:d=!0,c=[],q(a.elements,function(a){V(a,b),d=d&&a.constant,a.constant||c.push.apply(c,a.toWatch)}),a.constant=d,a.toWatch=c;break;case s.ObjectExpression:d=!0,c=[],q(a.properties,function(a){V(a.value,b),d=d&&a.value.constant&&!a.computed,a.value.constant||c.push.apply(c,a.value.toWatch)}),a.constant=d,a.toWatch=c;break;case s.ThisExpression:a.constant=!1,a.toWatch=[];break;case s.LocalsExpression:a.constant=!1,a.toWatch=[]}}function pd(a){if(1==a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function qd(a){return a.type===s.Identifier||a.type===s.MemberExpression}function rd(a){if(1===a.body.length&&qd(a.body[0].expression))return{type:s.AssignmentExpression,left:a.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function sd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function td(a,b){this.astBuilder=a,this.$filter=b}function ud(a,b){this.astBuilder=a,this.$filter=b}function Jb(a){return"constructor"==a}function ic(a){return z(a.valueOf)?a.valueOf():ng.call(a)}function uf(){var c,e,a=U(),b=U(),d={true:!0,false:!1,null:null,undefined:void 0};this.addLiteral=function(a,b){d[a]=b},this.setIdentifierFns=function(a,b){return c=a,e=b,this},this.$get=["$filter",function(f){function g(c,d,e){var g,k,H;switch(e=e||J,typeof c){case"string":H=c=c.trim();var E=e?b:a;if(g=E[H],!g){":"===c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2)),g=e?r:B;var q=new jc(g);g=new kc(q,f,g).parse(c),g.constant?g.$$watchDelegate=p:k?g.$$watchDelegate=g.literal?n:m:g.inputs&&(g.$$watchDelegate=l),e&&(g=h(g)),E[H]=g}return u(g,d);case"function":return u(c,d);default:return u(A,d)}}function h(a){function b(c,d,e,f){var g=J;J=!0;try{return a(c,d,e,f)}finally{J=g}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate,b.assign=h(a.assign),b.constant=a.constant,b.literal=a.literal;for(var c=0;a.inputs&&c<a.inputs.length;++c)a.inputs[c]=h(a.inputs[c]);return b.inputs=a.inputs,b}function k(a,b){return null==a||null==b?a===b:("object"!=typeof a||(a=ic(a),"object"!=typeof a))&&(a===b||a!==a&&b!==b)}function l(a,b,c,d,e){var g,f=d.inputs;if(1===f.length){var h=k,f=f[0];return a.$watch(function(a){var b=f(a);return k(b,h)||(g=d(a,void 0,void 0,[b]),h=b&&ic(b)),g},b,c,e)}for(var l=[],m=[],p=0,n=f.length;p<n;p++)l[p]=k,m[p]=null;return a.$watch(function(a){for(var b=!1,c=0,e=f.length;c<e;c++){var h=f[c](a);(b||(b=!k(h,l[c])))&&(m[c]=h,l[c]=h&&ic(h))}return b&&(g=d(a,void 0,void 0,m)),g},b,c,e)}function m(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a,z(b)&&b.apply(this,arguments),w(a)&&d.$$postDigest(function(){w(f)&&e()})},c)}function n(a,b,c,d){function e(a){var b=!0;return q(a,function(a){w(a)||(b=!1)}),b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a,z(b)&&b.call(this,a,c,d),e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function p(a,b,c,d){var e;return e=a.$watch(function(a){return e(),d(a)},b,c)}function u(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==n&&c!==m?function(c,e,f,g){return f=d&&g?g[0]:a(c,e,f,g),b(f,c,e)}:function(c,d,e,f){return e=a(c,d,e,f),c=b(e,c,d),w(e)?c:e};return a.$$watchDelegate&&a.$$watchDelegate!==l?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=l,d=!a.inputs,c.inputs=a.inputs?a.inputs:[a]),c}var R=Ba().noUnsafeEval,B={csp:R,expensiveChecks:!1,literals:pa(d),isIdentifierStart:z(c)&&c,isIdentifierContinue:z(e)&&e},r={csp:R,expensiveChecks:!0,literals:pa(d),isIdentifierStart:z(c)&&c,isIdentifierContinue:z(e)&&e},J=!1;return g.$$runningExpensiveChecks=function(){return J},g}]}function wf(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return vd(function(b){a.$evalAsync(b)},b)}]}function xf(){this.$get=["$browser","$exceptionHandler",function(a,b){return vd(function(b){a.defer(b)},b)}]}function vd(a,b){function d(){this.$$state={status:0}}function c(a,b){return function(c){b.call(a,c)}}function e(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,a(function(){var a,d,e;e=c.pending,c.processScheduled=!1,c.pending=void 0;for(var f=0,g=e.length;f<g;++f){d=e[f][0],a=e[f][c.status];try{z(a)?d.resolve(a(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),b(h)}}}))}function f(){this.promise=new d}var g=N("$q",TypeError),h=function(){var a=new f;return a.resolve=c(a,a.resolve),
@@ -15,9 +15,10 @@ us_tv_and_film:"you,i,to,that,it,me,what,this,know,i'm,no,have,my,don't,just,not
male_names:"james,john,robert,michael,william,david,richard,charles,joseph,thomas,christopher,daniel,paul,mark,donald,george,kenneth,steven,edward,brian,ronald,anthony,kevin,jason,matthew,gary,timothy,jose,larry,jeffrey,frank,scott,eric,stephen,andrew,raymond,gregory,joshua,jerry,dennis,walter,patrick,peter,harold,douglas,henry,carl,arthur,ryan,roger,joe,juan,jack,albert,jonathan,justin,terry,gerald,keith,samuel,willie,ralph,lawrence,nicholas,roy,benjamin,bruce,brandon,adam,harry,fred,wayne,billy,steve,louis,jeremy,aaron,randy,eugene,carlos,russell,bobby,victor,ernest,phillip,todd,jesse,craig,alan,shawn,clarence,sean,philip,chris,johnny,earl,jimmy,antonio,danny,bryan,tony,luis,mike,stanley,leonard,nathan,dale,manuel,rodney,curtis,norman,marvin,vincent,glenn,jeffery,travis,jeff,chad,jacob,melvin,alfred,kyle,francis,bradley,jesus,herbert,frederick,ray,joel,edwin,don,eddie,ricky,troy,randall,barry,bernard,mario,leroy,francisco,marcus,micheal,theodore,clifford,miguel,oscar,jay,jim,tom,calvin,alex,jon,ronnie,bill,lloyd,tommy,leon,derek,darrell,jerome,floyd,leo,alvin,tim,wesley,dean,greg,jorge,dustin,pedro,derrick,dan,zachary,corey,herman,maurice,vernon,roberto,clyde,glen,hector,shane,ricardo,sam,rick,lester,brent,ramon,tyler,gilbert,gene,marc,reginald,ruben,brett,nathaniel,rafael,edgar,milton,raul,ben,cecil,duane,andre,elmer,brad,gabriel,ron,roland,jared,adrian,karl,cory,claude,erik,darryl,neil,christian,javier,fernando,clinton,ted,mathew,tyrone,darren,lonnie,lance,cody,julio,kurt,allan,clayton,hugh,max,dwayne,dwight,armando,felix,jimmie,everett,ian,ken,bob,jaime,casey,alfredo,alberto,dave,ivan,johnnie,sidney,byron,julian,isaac,clifton,willard,daryl,virgil,andy,salvador,kirk,sergio,seth,kent,terrance,rene,eduardo,terrence,enrique,freddie,stuart,fredrick,arturo,alejandro,joey,nick,luther,wendell,jeremiah,evan,julius,donnie,otis,trevor,luke,homer,gerard,doug,kenny,hubert,angelo,shaun,lyle,matt,alfonso,orlando,rex,carlton,ernesto,pablo,lorenzo,omar,wilbur,blake,horace,roderick,kerry,abraham,rickey,ira,andres,cesar,johnathan,malcolm,rudolph,damon,kelvin,rudy,preston,alton,archie,marco,pete,randolph,garry,geoffrey,jonathon,felipe,bennie,gerardo,dominic,loren,delbert,colin,guillermo,earnest,benny,noel,rodolfo,myron,edmund,salvatore,cedric,lowell,gregg,sherman,devin,sylvester,roosevelt,israel,jermaine,forrest,wilbert,leland,simon,irving,owen,rufus,woodrow,sammy,kristopher,levi,marcos,gustavo,jake,lionel,marty,gilberto,clint,nicolas,laurence,ismael,orville,drew,ervin,dewey,wilfred,josh,hugo,ignacio,caleb,tomas,sheldon,erick,frankie,darrel,rogelio,terence,alonzo,elias,bert,elbert,ramiro,conrad,noah,grady,phil,cornelius,lamar,rolando,clay,percy,bradford,merle,darin,amos,terrell,moses,irvin,saul,roman,darnell,randal,tommie,timmy,darrin,brendan,toby,van,abel,dominick,emilio,elijah,cary,domingo,aubrey,emmett,marlon,emanuel,jerald,edmond,emil,dewayne,otto,teddy,reynaldo,bret,jess,trent,humberto,emmanuel,stephan,louie,vicente,lamont,garland,micah,efrain,heath,rodger,demetrius,ethan,eldon,rocky,pierre,eli,bryce,antoine,robbie,kendall,royce,sterling,grover,elton,cleveland,dylan,chuck,damian,reuben,stan,leonardo,russel,erwin,benito,hans,monte,blaine,ernie,curt,quentin,agustin,jamal,devon,adolfo,tyson,wilfredo,bart,jarrod,vance,denis,damien,joaquin,harlan,desmond,elliot,darwin,gregorio,kermit,roscoe,esteban,anton,solomon,norbert,elvin,nolan,carey,rod,quinton,hal,brain,rob,elwood,kendrick,darius,moises,marlin,fidel,thaddeus,cliff,marcel,ali,raphael,bryon,armand,alvaro,jeffry,dane,joesph,thurman,ned,sammie,rusty,michel,monty,rory,fabian,reggie,kris,isaiah,gus,avery,loyd,diego,adolph,millard,rocco,gonzalo,derick,rodrigo,gerry,rigoberto,alphonso,rickie,noe,vern,elvis,bernardo,mauricio,hiram,donovan,basil,nickolas,scot,vince,quincy,eddy,sebastian,federico,ulysses,heriberto,donnell,denny,gavin,emery,romeo,jayson,dion,dante,clement,coy,odell,jarvis,bruno,issac,dudley,sanford,colby,carmelo,nestor,hollis,stefan,donny,linwood,beau,weldon,galen,isidro,truman,delmar,johnathon,silas,frederic,irwin,merrill,charley,marcelino,carlo,trenton,kurtis,aurelio,winfred,vito,collin,denver,leonel,emory,pasquale,mohammad,mariano,danial,landon,dirk,branden,adan,numbers,clair,buford,bernie,wilmer,emerson,zachery,jacques,errol,josue,edwardo,wilford,theron,raymundo,daren,tristan,robby,lincoln,jame,genaro,octavio,cornell,hung,arron,antony,herschel,alva,giovanni,garth,cyrus,cyril,ronny,stevie,lon,kennith,carmine,augustine,erich,chadwick,wilburn,russ,myles,jonas,mitchel,mervin,zane,jamel,lazaro,alphonse,randell,johnie,jarrett,ariel,abdul,dusty,luciano,seymour,scottie,eugenio,mohammed,arnulfo,lucien,ferdinand,thad,ezra,aldo,rubin,mitch,earle,abe,marquis,lanny,kareem,jamar,boris,isiah,emile,elmo,aron,leopoldo,everette,josef,eloy,dorian,rodrick,reinaldo,lucio,jerrod,weston,hershel,lemuel,lavern,burt,jules,gil,eliseo,ahmad,nigel,efren,antwan,alden,margarito,refugio,dino,osvaldo,les,deandre,normand,kieth,ivory,trey,norberto,napoleon,jerold,fritz,rosendo,milford,sang,deon,christoper,alfonzo,lyman,josiah,brant,wilton,rico,jamaal,dewitt,brenton,yong,olin,faustino,claudio,judson,gino,edgardo,alec,jarred,donn,trinidad,tad,porfirio,odis,lenard,chauncey,tod,mel,marcelo,kory,augustus,keven,hilario,bud,sal,orval,mauro,dannie,zachariah,olen,anibal,milo,jed,thanh,amado,lenny,tory,richie,horacio,brice,mohamed,delmer,dario,mac,jonah,jerrold,robt,hank,sung,rupert,rolland,kenton,damion,chi,antone,waldo,fredric,bradly,kip,burl,tyree,jefferey,ahmed,willy,stanford,oren,moshe,mikel,enoch,brendon,quintin,jamison,florencio,darrick,tobias,minh,hassan,giuseppe,demarcus,cletus,tyrell,lyndon,keenan,werner,theo,geraldo,columbus,chet,bertram,markus,huey,hilton,dwain,donte,tyron,omer,isaias,hipolito,fermin,chung,adalberto,jamey,teodoro,mckinley,maximo,raleigh,lawerence,abram,rashad,emmitt,daron,chong,samual,otha,miquel,eusebio,dong,domenic,darron,wilber,renato,hoyt,haywood,ezekiel,chas,florentino,elroy,clemente,arden,neville,edison,deshawn,carrol,shayne,nathanial,jordon,danilo,claud,sherwood,raymon,rayford,cristobal,ambrose,titus,hyman,felton,ezequiel,erasmo,lonny,milan,lino,jarod,herb,andreas,rhett,jude,douglass,cordell,oswaldo,ellsworth,virgilio,toney,nathanael,benedict,mose,hong,isreal,garret,fausto,arlen,zack,modesto,francesco,manual,gaylord,gaston,filiberto,deangelo,michale,granville,malik,zackary,tuan,nicky,cristopher,antione,malcom,korey,jospeh,colton,waylon,hosea,shad,santo,rudolf,rolf,renaldo,marcellus,lucius,kristofer,harland,arnoldo,rueben,leandro,kraig,jerrell,jeromy,hobert,cedrick,arlie,winford,wally,luigi,keneth,jacinto,graig,franklyn,edmundo,leif,jeramy,willian,vincenzo,shon,michal,lynwood,jere,elden,darell,broderick,alonso".split(",")},module.exports=frequency_lists},{}],4:[function(require,module,exports){var feedback,matching,scoring,time,time_estimates,zxcvbn;matching=require("./matching"),scoring=require("./scoring"),time_estimates=require("./time_estimates"),feedback=require("./feedback"),time=function(){return(new Date).getTime()},zxcvbn=function(e,t){var i,n,c,s,a,r,m,o,u,g,_;for(null==t&&(t=[]),g=time(),u=[],c=0,s=t.length;s>c;c++)i=t[c],"string"!=(m=typeof i)&&"number"!==m&&"boolean"!==m||u.push(i.toString().toLowerCase());matching.set_user_input_dictionary(u),a=matching.omnimatch(e),o=scoring.most_guessable_match_sequence(e,a),o.calc_time=time()-g,n=time_estimates.estimate_attack_times(o.guesses);for(r in n)_=n[r],o[r]=_;return o.feedback=feedback.get_feedback(o.score,o.sequence),o},module.exports=zxcvbn},{"./feedback":2,"./matching":5,"./scoring":6,"./time_estimates":7}],5:[function(require,module,exports){var DATE_MAX_YEAR,DATE_MIN_YEAR,DATE_SPLITS,GRAPHS,L33T_TABLE,RANKED_DICTIONARIES,REGEXEN,adjacency_graphs,build_ranked_dict,frequency_lists,lst,matching,name,scoring;frequency_lists=require("./frequency_lists"),adjacency_graphs=require("./adjacency_graphs"),scoring=require("./scoring"),build_ranked_dict=function(e){var t,n,r,i,a;for(i={},t=1,r=0,n=e.length;n>r;r++)a=e[r],i[a]=t,t+=1;return i},RANKED_DICTIONARIES={};for(name in frequency_lists)lst=frequency_lists[name],RANKED_DICTIONARIES[name]=build_ranked_dict(lst);GRAPHS={qwerty:adjacency_graphs.qwerty,dvorak:adjacency_graphs.dvorak,keypad:adjacency_graphs.keypad,mac_keypad:adjacency_graphs.mac_keypad},L33T_TABLE={a:["4","@"],b:["8"],c:["(","{","[","<"],e:["3"],g:["6","9"],i:["1","!","|"],l:["1","|","7"],o:["0"],s:["$","5"],t:["+","7"],x:["%"],z:["2"]},REGEXEN={recent_year:/19\d\d|200\d|201\d/g},DATE_MAX_YEAR=2050,DATE_MIN_YEAR=1e3,DATE_SPLITS={4:[[1,2],[2,3]],5:[[1,3],[2,3]],6:[[1,2],[2,4],[4,5]],7:[[1,3],[2,3],[4,5],[4,6]],8:[[2,4],[4,6]]},matching={empty:function(e){var t;return 0===function(){var n;n=[];for(t in e)n.push(t);return n}().length},extend:function(e,t){return e.push.apply(e,t)},translate:function(e,t){var n;return function(){var r,i,a,s;for(a=e.split(""),s=[],i=0,r=a.length;r>i;i++)n=a[i],s.push(t[n]||n);return s}().join("")},mod:function(e,t){return(e%t+t)%t},sorted:function(e){return e.sort(function(e,t){return e.i-t.i||e.j-t.j})},omnimatch:function(e){var t,n,r,i,a;for(i=[],r=[this.dictionary_match,this.reverse_dictionary_match,this.l33t_match,this.spatial_match,this.repeat_match,this.sequence_match,this.regex_match,this.date_match],a=0,t=r.length;t>a;a++)n=r[a],this.extend(i,n.call(this,e));return this.sorted(i)},dictionary_match:function(e,t){var n,r,i,a,s,o,h,u,c,l,_,f,d,p;null==t&&(t=RANKED_DICTIONARIES),s=[],a=e.length,u=e.toLowerCase();for(n in t)for(l=t[n],r=o=0,_=a;_>=0?_>o:o>_;r=_>=0?++o:--o)for(i=h=f=r,d=a;d>=f?d>h:h>d;i=d>=f?++h:--h)u.slice(r,+i+1||9e9)in l&&(p=u.slice(r,+i+1||9e9),c=l[p],s.push({pattern:"dictionary",i:r,j:i,token:e.slice(r,+i+1||9e9),matched_word:p,rank:c,dictionary_name:n,reversed:!1,l33t:!1}));return this.sorted(s)},reverse_dictionary_match:function(e,t){var n,r,i,a,s,o;for(null==t&&(t=RANKED_DICTIONARIES),o=e.split("").reverse().join(""),i=this.dictionary_match(o,t),a=0,n=i.length;n>a;a++)r=i[a],r.token=r.token.split("").reverse().join(""),r.reversed=!0,s=[e.length-1-r.j,e.length-1-r.i],r.i=s[0],r.j=s[1];return this.sorted(i)},set_user_input_dictionary:function(e){return RANKED_DICTIONARIES.user_inputs=build_ranked_dict(e.slice())},relevant_l33t_subtable:function(e,t){var n,r,i,a,s,o,h,u,c,l;for(s={},o=e.split(""),a=0,r=o.length;r>a;a++)n=o[a],s[n]=!0;l={};for(i in t)c=t[i],h=function(){var e,t,n;for(n=[],t=0,e=c.length;e>t;t++)u=c[t],u in s&&n.push(u);return n}(),h.length>0&&(l[i]=h);return l},enumerate_l33t_subs:function(e){var t,n,r,i,a,s,o,h,u,c,l,_,f,d,p;a=function(){var t;t=[];for(i in e)t.push(i);return t}(),p=[[]],n=function(e){var t,n,r,a,s,o,h,u;for(n=[],s={},o=0,a=e.length;a>o;o++)h=e[o],t=function(){var e,t,n;for(n=[],u=t=0,e=h.length;e>t;u=++t)i=h[u],n.push([i,u]);return n}(),t.sort(),r=function(){var e,n,r;for(r=[],u=n=0,e=t.length;e>n;u=++n)i=t[u],r.push(i+","+u);return r}().join("-"),r in s||(s[r]=!0,n.push(h));return n},r=function(t){var i,a,s,o,h,u,c,l,_,f,d,g,m,A,E,y;if(t.length){for(a=t[0],m=t.slice(1),c=[],d=e[a],l=0,h=d.length;h>l;l++)for(o=d[l],_=0,u=p.length;u>_;_++){for(A=p[_],i=-1,s=f=0,g=A.length;g>=0?g>f:f>g;s=g>=0?++f:--f)if(A[s][0]===o){i=s;break}-1===i?(y=A.concat([[o,a]]),c.push(y)):(E=A.slice(0),E.splice(i,1),E.push([o,a]),c.push(A),c.push(E))}return p=n(c),r(m)}},r(a),d=[];for(u=0,o=p.length;o>u;u++){for(_=p[u],f={},c=0,h=_.length;h>c;c++)l=_[c],s=l[0],t=l[1],f[s]=t;d.push(f)}return d},l33t_match:function(e,t,n){var r,i,a,s,o,h,u,c,l,_,f,d,p,g,m,A;for(null==t&&(t=RANKED_DICTIONARIES),null==n&&(n=L33T_TABLE),u=[],_=this.enumerate_l33t_subs(this.relevant_l33t_subtable(e,n)),c=0,a=_.length;a>c&&(d=_[c],!this.empty(d));c++)for(g=this.translate(e,d),f=this.dictionary_match(g,t),l=0,s=f.length;s>l;l++)if(o=f[l],m=e.slice(o.i,+o.j+1||9e9),m.toLowerCase()!==o.matched_word){h={};for(p in d)r=d[p],-1!==m.indexOf(p)&&(h[p]=r);o.l33t=!0,o.token=m,o.sub=h,o.sub_display=function(){var e;e=[];for(i in h)A=h[i],e.push(i+" -> "+A);return e}().join(", "),u.push(o)}return this.sorted(u.filter(function(e){return e.token.length>1}))},spatial_match:function(e,t){var n,r,i;null==t&&(t=GRAPHS),i=[];for(r in t)n=t[r],this.extend(i,this.spatial_match_helper(e,n,r));return this.sorted(i)},SHIFTED_RX:/[~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?]/,spatial_match_helper:function(e,t,n){var r,i,a,s,o,h,u,c,l,_,f,d,p,g,m;for(f=[],u=0;u<e.length-1;)for(c=u+1,l=null,m=0,g="qwerty"!==n&&"dvorak"!==n||!this.SHIFTED_RX.exec(e.charAt(u))?0:1;;){if(p=e.charAt(c-1),o=!1,h=-1,s=-1,i=t[p]||[],c<e.length)for(a=e.charAt(c),d=0,_=i.length;_>d;d++)if(r=i[d],s+=1,r&&-1!==r.indexOf(a)){o=!0,h=s,1===r.indexOf(a)&&(g+=1),l!==h&&(m+=1,l=h);break}if(!o){c-u>2&&f.push({pattern:"spatial",i:u,j:c-1,token:e.slice(u,c),graph:n,turns:m,shifted_count:g}),u=c;break}c+=1}return f},repeat_match:function(e){var t,n,r,i,a,s,o,h,u,c,l,_,f,d,p;for(d=[],a=/(.+)\1+/g,c=/(.+?)\1+/g,l=/^(.+?)\1+$/,u=0;u<e.length&&(a.lastIndex=c.lastIndex=u,s=a.exec(e),_=c.exec(e),null!=s);)s[0].length>_[0].length?(f=s,i=l.exec(f[0])[1]):(f=_,i=f[1]),p=[f.index,f.index+f[0].length-1],o=p[0],h=p[1],t=scoring.most_guessable_match_sequence(i,this.omnimatch(i)),r=t.match_sequence,n=t.guesses,d.push({pattern:"repeat",i:o,j:h,token:f[0],base_token:i,base_guesses:n,base_matches:r,repeat_count:f[0].length/i.length}),u=h+1;return d},MAX_DELTA:5,sequence_match:function(e){var t,n,r,i,a,s,o,h,u;if(1===e.length)return[];for(u=function(t){return function(n,r,i){var a,s,o,u;return(r-n>1||1===Math.abs(i))&&0<(a=Math.abs(i))&&a<=t.MAX_DELTA?(u=e.slice(n,+r+1||9e9),/^[a-z]+$/.test(u)?(s="lower",o=26):/^[A-Z]+$/.test(u)?(s="upper",o=26):/^\d+$/.test(u)?(s="digits",o=10):(s="unicode",o=26),h.push({pattern:"sequence",i:n,j:r,token:e.slice(n,+r+1||9e9),sequence_name:s,sequence_space:o,ascending:i>0})):void 0}}(this),h=[],n=0,a=null,i=s=1,o=e.length;o>=1?o>s:s>o;i=o>=1?++s:--s)t=e.charCodeAt(i)-e.charCodeAt(i-1),null==a&&(a=t),t!==a&&(r=i-1,u(n,r,a),n=r,a=t);return u(n,e.length-1,a),h},regex_match:function(e,t){var n,r,i,a;null==t&&(t=REGEXEN),n=[];for(name in t)for(r=t[name],r.lastIndex=0;i=r.exec(e);)a=i[0],n.push({pattern:"regex",token:a,i:i.index,j:i.index+i[0].length-1,regex_name:name,regex_match:i});return this.sorted(n)},date_match:function(e){var t,n,r,i,a,s,o,h,u,c,l,_,f,d,p,g,m,A,E,y,v,I,R,T,D,k,x,j,b,N,S,q,L,M;for(_=[],f=/^\d{4,8}$/,d=/^(\d{1,4})([\s\/\\_.-])(\d{1,2})\2(\d{1,4})$/,s=m=0,v=e.length-4;v>=0?v>=m:m>=v;s=v>=0?++m:--m)for(o=A=I=s+3,R=s+7;(R>=I?R>=A:A>=R)&&!(o>=e.length);o=R>=I?++A:--A)if(M=e.slice(s,+o+1||9e9),f.exec(M)){for(r=[],T=DATE_SPLITS[M.length],E=0,c=T.length;c>E;E++)D=T[E],h=D[0],u=D[1],a=this.map_ints_to_dmy([parseInt(M.slice(0,h)),parseInt(M.slice(h,u)),parseInt(M.slice(u))]),null!=a&&r.push(a);if(r.length>0){for(t=r[0],p=function(e){return Math.abs(e.year-scoring.REFERENCE_YEAR)},g=p(r[0]),k=r.slice(1),y=0,l=k.length;l>y;y++)n=k[y],i=p(n),g>i&&(x=[n,i],t=x[0],g=x[1]);_.push({pattern:"date",token:M,i:s,j:o,separator:"",year:t.year,month:t.month,day:t.day})}}for(s=q=0,j=e.length-6;j>=0?j>=q:q>=j;s=j>=0?++q:--q)for(o=L=b=s+5,N=s+9;(N>=b?N>=L:L>=N)&&!(o>=e.length);o=N>=b?++L:--L)M=e.slice(s,+o+1||9e9),S=d.exec(M),null!=S&&(a=this.map_ints_to_dmy([parseInt(S[1]),parseInt(S[3]),parseInt(S[4])]),null!=a&&_.push({pattern:"date",token:M,i:s,j:o,separator:S[2],year:a.year,month:a.month,day:a.day}));return this.sorted(_.filter(function(e){var t,n,r,i;for(t=!1,i=0,n=_.length;n>i;i++)if(r=_[i],e!==r&&r.i<=e.i&&r.j>=e.j){t=!0;break}return!t}))},map_ints_to_dmy:function(e){var t,n,r,i,a,s,o,h,u,c,l,_,f,d,p,g;if(!(e[1]>31||e[1]<=0)){for(o=0,h=0,p=0,s=0,r=e.length;r>s;s++){if(n=e[s],n>99&&DATE_MIN_YEAR>n||n>DATE_MAX_YEAR)return;n>31&&(h+=1),n>12&&(o+=1),0>=n&&(p+=1)}if(!(h>=2||3===o||p>=2)){for(c=[[e[2],e.slice(0,2)],[e[0],e.slice(1,3)]],u=0,i=c.length;i>u;u++)if(_=c[u],g=_[0],d=_[1],g>=DATE_MIN_YEAR&&DATE_MAX_YEAR>=g)return t=this.map_ints_to_dm(d),null!=t?{year:g,month:t.month,day:t.day}:void 0;for(l=0,a=c.length;a>l;l++)if(f=c[l],g=f[0],d=f[1],t=this.map_ints_to_dm(d),null!=t)return g=this.two_to_four_digit_year(g),{year:g,month:t.month,day:t.day}}}},map_ints_to_dm:function(e){var t,n,r,i,a,s;for(a=[e,e.slice().reverse()],i=0,n=a.length;n>i;i++)if(s=a[i],t=s[0],r=s[1],t>=1&&31>=t&&r>=1&&12>=r)return{day:t,month:r}},two_to_four_digit_year:function(e){return e>99?e:e>50?e+1900:e+2e3}},module.exports=matching},{"./adjacency_graphs":1,"./frequency_lists":3,"./scoring":6}],6:[function(require,module,exports){var BRUTEFORCE_CARDINALITY,MIN_GUESSES_BEFORE_GROWING_SEQUENCE,MIN_SUBMATCH_GUESSES_MULTI_CHAR,MIN_SUBMATCH_GUESSES_SINGLE_CHAR,adjacency_graphs,calc_average_degree,k,scoring,v;adjacency_graphs=require("./adjacency_graphs"),calc_average_degree=function(e){var t,r,n,s,a,u;t=0;for(n in e)a=e[n],t+=function(){var e,t,r;for(r=[],t=0,e=a.length;e>t;t++)s=a[t],s&&r.push(s);return r}().length;return t/=function(){var t;t=[];for(r in e)u=e[r],t.push(r);return t}().length},BRUTEFORCE_CARDINALITY=10,MIN_GUESSES_BEFORE_GROWING_SEQUENCE=1e4,MIN_SUBMATCH_GUESSES_SINGLE_CHAR=10,MIN_SUBMATCH_GUESSES_MULTI_CHAR=50,scoring={nCk:function(e,t){var r,n,s,a;if(t>e)return 0;if(0===t)return 1;for(s=1,r=n=1,a=t;a>=1?a>=n:n>=a;r=a>=1?++n:--n)s*=e,s/=r,e-=1;return s},log10:function(e){return Math.log(e)/Math.log(10)},log2:function(e){return Math.log(e)/Math.log(2)},factorial:function(e){var t,r,n,s;if(2>e)return 1;for(t=1,r=n=2,s=e;s>=2?s>=n:n>=s;r=s>=2?++n:--n)t*=r;return t},most_guessable_match_sequence:function(e,t,r){var n,s,a,u,i,_,o,h,E,c,g,f,l,p,A,S,R,v,I,M;for(null==r&&(r=!1),g=e.length,c=function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push([]);return r}(),f=0,_=t.length;_>f;f++)h=t[f],c[h.j].push(h);for(l={m:function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push({});return r}(),pi:function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push({});return r}(),g:function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push(1/0);return r}(),l:function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push(0);return r}()},M=function(t){return function(n,s){var a,u,i;return u=n.j,i=t.estimate_guesses(n,e),s>1&&(i*=l.pi[n.i-1][s-1]),a=t.factorial(s)*i,r||(a+=Math.pow(MIN_GUESSES_BEFORE_GROWING_SEQUENCE,s-1)),a<l.g[u]?(l.g[u]=a,l.l[u]=s,l.m[u][s]=n,l.pi[u][s]=i):void 0}}(this),s=function(e){return function(e){var t,r,n,s;if(h=E(0,e),M(h,1),0!==e){n=l.m[e-1],s=[];for(t in n)r=n[t],t=parseInt(t),"bruteforce"===r.pattern?(h=E(r.i,e),s.push(M(h,t))):(h=E(e,e),s.push(M(h,t+1)));return s}}}(this),E=function(t){return function(t,r){return{pattern:"bruteforce",token:e.slice(t,+r+1||9e9),i:t,j:r}}}(this),I=function(e){return function(e){var t,r,n;for(n=[],t=e-1,r=l.l[t];t>=0;)h=l.m[t][r],n.unshift(h),t=h.i-1,r--;return n}}(this),u=A=0,S=g;S>=0?S>A:A>S;u=S>=0?++A:--A){for(R=c[u],v=0,o=R.length;o>v;v++)if(h=R[v],h.i>0)for(i in l.m[h.i-1])i=parseInt(i),M(h,i+1);else M(h,1);s(u)}return p=I(g),a=0===e.length?1:l.g[g-1],{password:e,guesses:a,guesses_log10:this.log10(a),sequence:p}},estimate_guesses:function(e,t){var r,n,s;return null!=e.guesses?e.guesses:(s=1,e.token.length<t.length&&(s=1===e.token.length?MIN_SUBMATCH_GUESSES_SINGLE_CHAR:MIN_SUBMATCH_GUESSES_MULTI_CHAR),r={bruteforce:this.bruteforce_guesses,dictionary:this.dictionary_guesses,spatial:this.spatial_guesses,repeat:this.repeat_guesses,sequence:this.sequence_guesses,regex:this.regex_guesses,date:this.date_guesses},n=r[e.pattern].call(this,e),e.guesses=Math.max(n,s),e.guesses_log10=this.log10(e.guesses),e.guesses)},bruteforce_guesses:function(e){var t,r;return t=Math.pow(BRUTEFORCE_CARDINALITY,e.token.length),r=1===e.token.length?MIN_SUBMATCH_GUESSES_SINGLE_CHAR+1:MIN_SUBMATCH_GUESSES_MULTI_CHAR+1,Math.max(t,r)},repeat_guesses:function(e){return e.base_guesses*e.repeat_count},sequence_guesses:function(e){var t,r;return r=e.token.charAt(0),t="a"===r||"A"===r||"z"===r||"Z"===r||"0"===r||"1"===r||"9"===r?4:r.match(/\d/)?10:26,e.ascending||(t*=2),t*e.token.length},MIN_YEAR_SPACE:20,REFERENCE_YEAR:2016,regex_guesses:function(e){var t,r;if(t={alpha_lower:26,alpha_upper:26,alpha:52,alphanumeric:62,digits:10,symbols:33},e.regex_name in t)return Math.pow(t[e.regex_name],e.token.length);switch(e.regex_name){case"recent_year":return r=Math.abs(parseInt(e.regex_match[0])-this.REFERENCE_YEAR),r=Math.max(r,this.MIN_YEAR_SPACE)}},date_guesses:function(e){var t,r;return r=Math.max(Math.abs(e.year-this.REFERENCE_YEAR),this.MIN_YEAR_SPACE),t=365*r,e.has_full_year&&(t*=2),e.separator&&(t*=4),t},KEYBOARD_AVERAGE_DEGREE:calc_average_degree(adjacency_graphs.qwerty),KEYPAD_AVERAGE_DEGREE:calc_average_degree(adjacency_graphs.keypad),KEYBOARD_STARTING_POSITIONS:function(){var e,t;e=adjacency_graphs.qwerty,t=[];for(k in e)v=e[k],t.push(k);return t}().length,KEYPAD_STARTING_POSITIONS:function(){var e,t;e=adjacency_graphs.keypad,t=[];for(k in e)v=e[k],t.push(k);return t}().length,spatial_guesses:function(e){var t,r,n,s,a,u,i,_,o,h,E,c,g,f,l,p,A,S;for("qwerty"===(E=e.graph)||"dvorak"===E?(l=this.KEYBOARD_STARTING_POSITIONS,s=this.KEYBOARD_AVERAGE_DEGREE):(l=this.KEYPAD_STARTING_POSITIONS,s=this.KEYPAD_AVERAGE_DEGREE),a=0,t=e.token.length,A=e.turns,u=_=2,c=t;c>=2?c>=_:_>=c;u=c>=2?++_:--_)for(o=Math.min(A,u-1),i=h=1,g=o;g>=1?g>=h:h>=g;i=g>=1?++h:--h)a+=this.nCk(u-1,i-1)*l*Math.pow(s,i);if(e.shifted_count)if(r=e.shifted_count,n=e.token.length-e.shifted_count,0===r||0===n)a*=2;else{for(p=0,u=S=1,f=Math.min(r,n);f>=1?f>=S:S>=f;u=f>=1?++S:--S)p+=this.nCk(r+n,u);a*=p}return a},dictionary_guesses:function(e){var t;return e.base_guesses=e.rank,e.uppercase_variations=this.uppercase_variations(e),e.l33t_variations=this.l33t_variations(e),t=e.reversed&&2||1,e.base_guesses*e.uppercase_variations*e.l33t_variations*t},START_UPPER:/^[A-Z][^A-Z]+$/,END_UPPER:/^[^A-Z]+[A-Z]$/,ALL_UPPER:/^[^a-z]+$/,ALL_LOWER:/^[^A-Z]+$/,uppercase_variations:function(e){var t,r,n,s,a,u,i,_,o,h,E,c;if(c=e.token,c.match(this.ALL_LOWER)||c.toLowerCase()===c)return 1;for(_=[this.START_UPPER,this.END_UPPER,this.ALL_UPPER],u=0,a=_.length;a>u;u++)if(h=_[u],c.match(h))return 2;for(r=function(){var e,t,r,s;for(r=c.split(""),s=[],t=0,e=r.length;e>t;t++)n=r[t],n.match(/[A-Z]/)&&s.push(n);return s}().length,t=function(){var e,t,r,s;for(r=c.split(""),s=[],t=0,e=r.length;e>t;t++)n=r[t],n.match(/[a-z]/)&&s.push(n);return s}().length,E=0,s=i=1,o=Math.min(r,t);o>=1?o>=i:i>=o;s=o>=1?++i:--i)E+=this.nCk(r+t,s);return E},l33t_variations:function(e){var t,r,n,s,a,u,i,_,o,h,E,c,g;if(!e.l33t)return 1;g=1,o=e.sub;for(E in o)if(c=o[E],s=e.token.toLowerCase().split(""),t=function(){var e,t,r;for(r=[],t=0,e=s.length;e>t;t++)n=s[t],n===E&&r.push(n);return r}().length,r=function(){var e,t,r;for(r=[],t=0,e=s.length;e>t;t++)n=s[t],n===c&&r.push(n);return r}().length,0===t||0===r)g*=2;else{for(i=Math.min(r,t),_=0,a=u=1,h=i;h>=1?h>=u:u>=h;a=h>=1?++u:--u)_+=this.nCk(r+t,a);g*=_}return g}},module.exports=scoring},{"./adjacency_graphs":1}],7:[function(require,module,exports){var time_estimates;time_estimates={estimate_attack_times:function(e){var t,n,s,o;n={online_throttling_100_per_hour:e/(100/3600),online_no_throttling_10_per_second:e/10,offline_slow_hashing_1e4_per_second:e/1e4,offline_fast_hashing_1e10_per_second:e/1e10},t={};for(s in n)o=n[s],t[s]=this.display_time(o);return{crack_times_seconds:n,crack_times_display:t,score:this.guesses_to_score(e)}},guesses_to_score:function(e){var t;return t=5,1e3+t>e?0:1e6+t>e?1:1e8+t>e?2:1e10+t>e?3:4},display_time:function(e){var t,n,s,o,_,r,i,a,u,c;return i=60,r=60*i,s=24*r,a=31*s,c=12*a,n=100*c,u=1>e?[null,"less than a second"]:i>e?(t=Math.round(e),[t,t+" second"]):r>e?(t=Math.round(e/i),[t,t+" minute"]):s>e?(t=Math.round(e/r),[t,t+" hour"]):a>e?(t=Math.round(e/s),[t,t+" day"]):c>e?(t=Math.round(e/a),[t,t+" month"]):n>e?(t=Math.round(e/c),[t,t+" year"]):[null,"centuries"],o=u[0],_=u[1],null!=o&&1!==o&&(_+="s"),_}},module.exports=time_estimates},{}]},{},[4])(4)}),!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t;return function t(e,n,o){function i(c,a){if(!n[c]){if(!e[c]){var s="function"==typeof require&&require;if(!a&&s)return s(c,!0);if(r)return r(c,!0);var l=new Error("Cannot find module '"+c+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[c]={exports:{}};e[c][0].call(u.exports,function(t){var n=e[c][1][t];return i(n?n:t)},u,u.exports,t,e,n,o)}return n[c].exports}for(var r="function"==typeof require&&require,c=0;c<o.length;c++)i(o[c]);return i}({1:[function(t,e,n){var o=t("matches-selector");e.exports=function(t,e,n){for(var i=n?t:t.parentNode;i&&i!==document;){if(o(i,e))return i;i=i.parentNode}}},{"matches-selector":5}],2:[function(t,e,n){function o(t,e,n,o,r){var c=i.apply(this,arguments);return t.addEventListener(n,c,r),{destroy:function(){t.removeEventListener(n,c,r)}}}function i(t,e,n,o){return function(n){n.delegateTarget=r(n.target,e,!0),n.delegateTarget&&o.call(t,n)}}var r=t("closest");e.exports=o},{closest:1}],3:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){var e=Object.prototype.toString.call(t);return"[object Function]"===e}},{}],4:[function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!a.string(e))throw new TypeError("Second argument must be a String");if(!a.fn(n))throw new TypeError("Third argument must be a Function");if(a.node(t))return i(t,e,n);if(a.nodeList(t))return r(t,e,n);if(a.string(t))return c(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function r(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function c(t,e,n){return s(document.body,t,e,n)}var a=t("./is"),s=t("delegate");e.exports=o},{"./is":3,delegate:2}],5:[function(t,e,n){function o(t,e){if(r)return r.call(t,e);for(var n=t.parentNode.querySelectorAll(e),o=0;o<n.length;++o)if(n[o]==t)return!0;return!1}var i=Element.prototype,r=i.matchesSelector||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector;e.exports=o},{}],6:[function(t,e,n){function o(t){var e;if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName)t.focus(),t.setSelectionRange(0,t.value.length),e=t.value;else{t.hasAttribute("contenteditable")&&t.focus();var n=window.getSelection(),o=document.createRange();o.selectNodeContents(t),n.removeAllRanges(),n.addRange(o),e=n.toString()}return e}e.exports=o},{}],7:[function(t,e,n){function o(){}o.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){i.off(t,o),e.apply(n,arguments)}var i=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,i=n.length;for(o;i>o;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],i=[];if(o&&e)for(var r=0,c=o.length;c>r;r++)o[r].fn!==e&&o[r].fn._!==e&&i.push(o[r]);return i.length?n[t]=i:delete n[t],this}},e.exports=o},{}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","select"],r);else if("undefined"!=typeof o)r(n,e("select"));else{var c={exports:{}};r(c,i.select),i.clipboardAction=c.exports}}(this,function(t,e){function n(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=n(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},c=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),a=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return t.prototype.resolveOptions=function(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action=e.action,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""},t.prototype.initSelection=function(){this.text?this.selectFake():this.target&&this.selectTarget()},t.prototype.selectFake=function(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandler=document.body.addEventListener("click",function(){return e.removeFake()}),this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="fixed",this.fakeElem.style[n?"right":"left"]="-9999px",this.fakeElem.style.top=(window.pageYOffset||document.documentElement.scrollTop)+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()},t.prototype.removeFake=function(){this.fakeHandler&&(document.body.removeEventListener("click"),this.fakeHandler=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)},t.prototype.selectTarget=function(){this.selectedText=(0,i.default)(this.target),this.copyText()},t.prototype.copyText=function(){var e=void 0;try{e=document.execCommand(this.action)}catch(n){e=!1}this.handleResult(e)},t.prototype.handleResult=function(e){e?this.emitter.emit("success",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)}):this.emitter.emit("error",{action:this.action,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})},t.prototype.clearSelection=function(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()},t.prototype.destroy=function(){this.removeFake()},c(t,[{key:"action",set:function(){var e=arguments.length<=0||void 0===arguments[0]?"copy":arguments[0];if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==("undefined"==typeof e?"undefined":r(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),t}();t.exports=a})},{select:6}],9:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if("undefined"!=typeof o)r(n,e("./clipboard-action"),e("tiny-emitter"),e("good-listener"));else{var c={exports:{}};r(c,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=c.exports}}(this,function(t,e,n,o){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){
if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var l=i(e),u=i(n),f=i(o),d=function(t){function e(n,o){r(this,e);var i=c(this,t.call(this));return i.resolveOptions(o),i.listenClick(n),i}return a(e,t),e.prototype.resolveOptions=function(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText},e.prototype.listenClick=function(e){var n=this;this.listener=(0,f.default)(e,"click",function(t){return n.onClick(t)})},e.prototype.onClick=function(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})},e.prototype.defaultAction=function(e){return s("action",e)},e.prototype.defaultTarget=function(e){var n=s("target",e);return n?document.querySelector(n):void 0},e.prototype.defaultText=function(e){return s("text",e)},e.prototype.destroy=function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)},e}(u.default);t.exports=d})},{"./clipboard-action":8,"good-listener":4,"tiny-emitter":7}]},{},[9])(9)}),function(){var angular,Clipboard,MODULE_NAME="ngclipboard";"object"==typeof module&&module.exports?(angular=require("angular"),Clipboard=require("clipboard"),module.exports=MODULE_NAME):(angular=window.angular,Clipboard=window.Clipboard),angular.module(MODULE_NAME,[]).directive("ngclipboard",function(){return{restrict:"A",scope:{ngclipboardSuccess:"&",ngclipboardError:"&"},link:function(scope,element){var clipboard=new Clipboard(element[0]);clipboard.on("success",function(e){scope.$apply(function(){scope.ngclipboardSuccess({e:e})})}),clipboard.on("error",function(e){scope.$apply(function(){scope.ngclipboardError({e:e})})})}}})}(),!function(){var a={backspace:8,tab:9,enter:13,escape:27,space:32,up:38,down:40,left:37,right:39,delete:46,comma:188},b=9007199254740991,c=["text","email","url"],d=angular.module("ngTagsInput",[]);d.directive("tagsInput",["$timeout","$document","$window","$q","tagsInputConfig","tiUtil",function(d,e,f,g,h,i){function j(a,b,c,d){var e,f,h,j,k={};return e=function(b){return i.safeToString(b[a.displayProperty])},f=function(b,c){b[a.displayProperty]=c},h=function(b){var d=e(b),f=d&&d.length>=a.minLength&&d.length<=a.maxLength&&a.allowedTagsPattern.test(d)&&!i.findInObjectArray(k.items,b,a.keyProperty||a.displayProperty);return g.when(f&&c({$tag:b})).then(i.promisifyValue)},j=function(a){return g.when(d({$tag:a})).then(i.promisifyValue)},k.items=[],k.addText=function(a){var b={};return f(b,a),k.add(b)},k.add=function(c){var d=e(c);return a.replaceSpacesWithDashes&&(d=i.replaceSpacesWithDashes(d)),f(c,d),h(c).then(function(){k.items.push(c),b.trigger("tag-added",{$tag:c})}).catch(function(){d&&b.trigger("invalid-tag",{$tag:c})})},k.remove=function(a){var c=k.items[a];return j(c).then(function(){return k.items.splice(a,1),k.clearSelection(),b.trigger("tag-removed",{$tag:c}),c})},k.select=function(a){0>a?a=k.items.length-1:a>=k.items.length&&(a=0),k.index=a,k.selected=k.items[a]},k.selectPrior=function(){k.select(--k.index)},k.selectNext=function(){k.select(++k.index)},k.removeSelected=function(){return k.remove(k.index)},k.clearSelection=function(){k.selected=null,k.index=-1},k.clearSelection(),k}function k(a){return-1!==c.indexOf(a)}return{restrict:"E",require:"ngModel",scope:{tags:"=ngModel",text:"=?",templateScope:"=?",tagClass:"&",onTagAdding:"&",onTagAdded:"&",onInvalidTag:"&",onTagRemoving:"&",onTagRemoved:"&",onTagClicked:"&"},replace:!1,transclude:!0,templateUrl:"ngTagsInput/tags-input.html",controller:["$scope","$attrs","$element",function(a,c,d){a.events=i.simplePubSub(),h.load("tagsInput",a,c,{template:[String,"ngTagsInput/tag-item.html"],type:[String,"text",k],placeholder:[String,"Add a tag"],tabindex:[Number,null],removeTagSymbol:[String,String.fromCharCode(215)],replaceSpacesWithDashes:[Boolean,!0],minLength:[Number,3],maxLength:[Number,b],addOnEnter:[Boolean,!0],addOnSpace:[Boolean,!1],addOnComma:[Boolean,!0],addOnBlur:[Boolean,!0],addOnPaste:[Boolean,!1],pasteSplitPattern:[RegExp,/,/],allowedTagsPattern:[RegExp,/.+/],enableEditingLastTag:[Boolean,!1],minTags:[Number,0],maxTags:[Number,b],displayProperty:[String,"text"],keyProperty:[String,""],allowLeftoverText:[Boolean,!1],addFromAutocompleteOnly:[Boolean,!1],spellcheck:[Boolean,!0]}),a.tagList=new j(a.options,a.events,i.handleUndefinedResult(a.onTagAdding,!0),i.handleUndefinedResult(a.onTagRemoving,!0)),this.registerAutocomplete=function(){return d.find("input"),{addTag:function(b){return a.tagList.add(b)},getTags:function(){return a.tagList.items},getCurrentTagText:function(){return a.newTag.text()},getOptions:function(){return a.options},getTemplateScope:function(){return a.templateScope},on:function(b,c){return a.events.on(b,c,!0),this}}},this.registerTagItem=function(){return{getOptions:function(){return a.options},removeTag:function(b){a.disabled||a.tagList.remove(b)}}}}],link:function(b,c,g,h){var j,k,l=[a.enter,a.comma,a.space,a.backspace,a.delete,a.left,a.right],m=b.tagList,n=b.events,o=b.options,p=c.find("input"),q=["minTags","maxTags","allowLeftoverText"];j=function(){h.$setValidity("maxTags",m.items.length<=o.maxTags),h.$setValidity("minTags",m.items.length>=o.minTags),h.$setValidity("leftoverText",!(!b.hasFocus&&!o.allowLeftoverText)||!b.newTag.text())},k=function(){d(function(){p[0].focus()})},h.$isEmpty=function(a){return!a||!a.length},b.newTag={text:function(a){return angular.isDefined(a)?(b.text=a,void n.trigger("input-change",a)):b.text||""},invalid:null},b.track=function(a){return a[o.keyProperty||o.displayProperty]},b.getTagClass=function(a,c){var d=a===m.selected;return[b.tagClass({$tag:a,$index:c,$selected:d}),{selected:d}]},b.$watch("tags",function(a){a?(m.items=i.makeObjectArray(a,o.displayProperty),b.tags=m.items):m.items=[]}),b.$watch("tags.length",function(){j(),h.$validate()}),g.$observe("disabled",function(a){b.disabled=a}),b.eventHandlers={input:{keydown:function(a){n.trigger("input-keydown",a)},focus:function(){b.hasFocus||(b.hasFocus=!0,n.trigger("input-focus"))},blur:function(){d(function(){var a=e.prop("activeElement"),d=a===p[0],f=c[0].contains(a);!d&&f||(b.hasFocus=!1,n.trigger("input-blur"))})},paste:function(a){a.getTextData=function(){var b=a.clipboardData||a.originalEvent&&a.originalEvent.clipboardData;return b?b.getData("text/plain"):f.clipboardData.getData("Text")},n.trigger("input-paste",a)}},host:{click:function(){b.disabled||k()}},tag:{click:function(a){n.trigger("tag-clicked",{$tag:a})}}},n.on("tag-added",b.onTagAdded).on("invalid-tag",b.onInvalidTag).on("tag-removed",b.onTagRemoved).on("tag-clicked",b.onTagClicked).on("tag-added",function(){b.newTag.text("")}).on("tag-added tag-removed",function(){b.tags=m.items,h.$setDirty(),k()}).on("invalid-tag",function(){b.newTag.invalid=!0}).on("option-change",function(a){-1!==q.indexOf(a.name)&&j()}).on("input-change",function(){m.clearSelection(),b.newTag.invalid=null}).on("input-focus",function(){c.triggerHandler("focus"),h.$setValidity("leftoverText",!0)}).on("input-blur",function(){o.addOnBlur&&!o.addFromAutocompleteOnly&&m.addText(b.newTag.text()),c.triggerHandler("blur"),j()}).on("input-keydown",function(c){var d,e,f,g,h=c.keyCode,j={};i.isModifierOn(c)||-1===l.indexOf(h)||(j[a.enter]=o.addOnEnter,j[a.comma]=o.addOnComma,j[a.space]=o.addOnSpace,d=!o.addFromAutocompleteOnly&&j[h],e=(h===a.backspace||h===a.delete)&&m.selected,g=h===a.backspace&&0===b.newTag.text().length&&o.enableEditingLastTag,f=(h===a.backspace||h===a.left||h===a.right)&&0===b.newTag.text().length&&!o.enableEditingLastTag,d?m.addText(b.newTag.text()):g?(m.selectPrior(),m.removeSelected().then(function(a){a&&b.newTag.text(a[o.displayProperty])})):e?m.removeSelected():f&&(h===a.left||h===a.backspace?m.selectPrior():h===a.right&&m.selectNext()),(d||f||e||g)&&c.preventDefault())}).on("input-paste",function(a){if(o.addOnPaste){var b=a.getTextData(),c=b.split(o.pasteSplitPattern);c.length>1&&(c.forEach(function(a){m.addText(a)}),a.preventDefault())}})}}}]),d.directive("tiTagItem",["tiUtil",function(a){return{restrict:"E",require:"^tagsInput",template:'<ng-include src="$$template"></ng-include>',scope:{$scope:"=scope",data:"="},link:function(b,c,d,e){var f=e.registerTagItem(),g=f.getOptions();b.$$template=g.template,b.$$removeTagSymbol=g.removeTagSymbol,b.$getDisplayText=function(){return a.safeToString(b.data[g.displayProperty])},b.$removeTag=function(){f.removeTag(b.$index)},b.$watch("$parent.$index",function(a){b.$index=a})}}}]),d.directive("autoComplete",["$document","$timeout","$sce","$q","tagsInputConfig","tiUtil",function(b,c,d,e,f,g){function h(a,b,c){var d,f,h,i={};return h=function(){return b.tagsInput.keyProperty||b.tagsInput.displayProperty},d=function(a,c){return a.filter(function(a){return!g.findInObjectArray(c,a,h(),function(a,c){return b.tagsInput.replaceSpacesWithDashes&&(a=g.replaceSpacesWithDashes(a),c=g.replaceSpacesWithDashes(c)),g.defaultComparer(a,c)})})},i.reset=function(){f=null,i.items=[],i.visible=!1,i.index=-1,i.selected=null,i.query=null},i.show=function(){b.selectFirstMatch?i.select(0):i.selected=null,i.visible=!0},i.load=g.debounce(function(c,j){i.query=c;var k=e.when(a({$query:c}));f=k,k.then(function(a){k===f&&(a=g.makeObjectArray(a.data||a,h()),a=d(a,j),i.items=a.slice(0,b.maxResultsToShow),i.items.length>0?i.show():i.reset())})},b.debounceDelay),i.selectNext=function(){i.select(++i.index)},i.selectPrior=function(){i.select(--i.index)},i.select=function(a){0>a?a=i.items.length-1:a>=i.items.length&&(a=0),i.index=a,i.selected=i.items[a],c.trigger("suggestion-selected",a)},i.reset(),i}function i(a,b){var c=a.find("li").eq(b),d=c.parent(),e=c.prop("offsetTop"),f=c.prop("offsetHeight"),g=d.prop("clientHeight"),h=d.prop("scrollTop");h>e?d.prop("scrollTop",e):e+f>g+h&&d.prop("scrollTop",e+f-g)}return{restrict:"E",require:"^tagsInput",scope:{source:"&",matchClass:"&"},templateUrl:"ngTagsInput/auto-complete.html",controller:["$scope","$element","$attrs",function(a,b,c){a.events=g.simplePubSub(),f.load("autoComplete",a,c,{template:[String,"ngTagsInput/auto-complete-match.html"],debounceDelay:[Number,100],minLength:[Number,3],highlightMatchedText:[Boolean,!0],maxResultsToShow:[Number,10],loadOnDownArrow:[Boolean,!1],loadOnEmpty:[Boolean,!1],loadOnFocus:[Boolean,!1],selectFirstMatch:[Boolean,!0],displayProperty:[String,""]}),a.suggestionList=new h(a.source,a.options,a.events),this.registerAutocompleteMatch=function(){return{getOptions:function(){return a.options},getQuery:function(){return a.suggestionList.query}}}}],link:function(b,c,d,e){var f,h=[a.enter,a.tab,a.escape,a.up,a.down],j=b.suggestionList,k=e.registerAutocomplete(),l=b.options,m=b.events;l.tagsInput=k.getOptions(),f=function(a){return a&&a.length>=l.minLength||!a&&l.loadOnEmpty},b.templateScope=k.getTemplateScope(),b.addSuggestionByIndex=function(a){j.select(a),b.addSuggestion()},b.addSuggestion=function(){var a=!1;return j.selected&&(k.addTag(angular.copy(j.selected)),j.reset(),a=!0),a},b.track=function(a){return a[l.tagsInput.keyProperty||l.tagsInput.displayProperty]},b.getSuggestionClass=function(a,c){var d=a===j.selected;return[b.matchClass({$match:a,$index:c,$selected:d}),{selected:d}]},k.on("tag-added tag-removed invalid-tag input-blur",function(){j.reset()}).on("input-change",function(a){f(a)?j.load(a,k.getTags()):j.reset()}).on("input-focus",function(){var a=k.getCurrentTagText();l.loadOnFocus&&f(a)&&j.load(a,k.getTags())}).on("input-keydown",function(c){var d=c.keyCode,e=!1;if(!g.isModifierOn(c)&&-1!==h.indexOf(d))return j.visible?d===a.down?(j.selectNext(),e=!0):d===a.up?(j.selectPrior(),e=!0):d===a.escape?(j.reset(),e=!0):d!==a.enter&&d!==a.tab||(e=b.addSuggestion()):d===a.down&&b.options.loadOnDownArrow&&(j.load(k.getCurrentTagText(),k.getTags()),e=!0),e?(c.preventDefault(),c.stopImmediatePropagation(),!1):void 0}),m.on("suggestion-selected",function(a){i(c,a)})}}}]),d.directive("tiAutocompleteMatch",["$sce","tiUtil",function(a,b){return{restrict:"E",require:"^autoComplete",template:'<ng-include src="$$template"></ng-include>',scope:{$scope:"=scope",data:"="},link:function(c,d,e,f){var g=f.registerAutocompleteMatch(),h=g.getOptions();c.$$template=h.template,c.$index=c.$parent.$index,c.$highlight=function(c){return h.highlightMatchedText&&(c=b.safeHighlight(c,g.getQuery())),a.trustAsHtml(c)},c.$getDisplayText=function(){return b.safeToString(c.data[h.displayProperty||h.tagsInput.displayProperty])}}}}]),d.directive("tiTranscludeAppend",function(){return function(a,b,c,d,e){e(function(a){b.append(a)})}}),d.directive("tiAutosize",["tagsInputConfig",function(a){return{restrict:"A",require:"ngModel",link:function(b,c,d,e){var f,g,h=a.getTextAutosizeThreshold();f=angular.element('<span class="input"></span>'),f.css("display","none").css("visibility","hidden").css("width","auto").css("white-space","pre"),c.parent().append(f),g=function(a){var b,e=a;return angular.isString(e)&&0===e.length&&(e=d.placeholder),e&&(f.text(e),f.css("display",""),b=f.prop("offsetWidth"),f.css("display","none")),c.css("width",b?b+h+"px":""),a},e.$parsers.unshift(g),e.$formatters.unshift(g),d.$observe("placeholder",function(a){e.$modelValue||g(a)})}}}]),d.directive("tiBindAttrs",function(){return function(a,b,c){a.$watch(c.tiBindAttrs,function(a){angular.forEach(a,function(a,b){c.$set(b,a)})},!0)}}),d.provider("tagsInputConfig",function(){var a={},b={},c=3;this.setDefaults=function(b,c){return a[b]=c,this},this.setActiveInterpolation=function(a,c){return b[a]=c,this},this.setTextAutosizeThreshold=function(a){return c=a,this},this.$get=["$interpolate",function(d){var e={};return e[String]=function(a){return a},e[Number]=function(a){return parseInt(a,10)},e[Boolean]=function(a){return"true"===a.toLowerCase()},e[RegExp]=function(a){return new RegExp(a)},{load:function(c,f,g,h){var i=function(){return!0};f.options={},angular.forEach(h,function(h,j){var k,l,m,n,o,p;k=h[0],l=h[1],m=h[2]||i,n=e[k],o=function(){var b=a[c]&&a[c][j];return angular.isDefined(b)?b:l},p=function(a){f.options[j]=a&&m(a)?n(a):o()},b[c]&&b[c][j]?g.$observe(j,function(a){p(a),f.events.trigger("option-change",{name:j,newValue:a})}):p(g[j]&&d(g[j])(f.$parent))})},getTextAutosizeThreshold:function(){return c}}}]}),d.factory("tiUtil",["$timeout","$q",function(a,b){var c={};return c.debounce=function(b,c){var d;return function(){var e=arguments;a.cancel(d),d=a(function(){b.apply(null,e)},c)}},c.makeObjectArray=function(a,b){if(!angular.isArray(a)||0===a.length||angular.isObject(a[0]))return a;var c=[];return a.forEach(function(a){var d={};d[b]=a,c.push(d)}),c},c.findInObjectArray=function(a,b,d,e){var f=null;return e=e||c.defaultComparer,a.some(function(a){return e(a[d],b[d])?(f=a,!0):void 0}),f},c.defaultComparer=function(a,b){return c.safeToString(a).toLowerCase()===c.safeToString(b).toLowerCase()},c.safeHighlight=function(a,b){function d(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}if(!b)return a;a=c.encodeHTML(a),b=c.encodeHTML(b);var e=new RegExp("&[^;]+;|"+d(b),"gi");return a.replace(e,function(a){return a.toLowerCase()===b.toLowerCase()?"<em>"+a+"</em>":a})},c.safeToString=function(a){return angular.isUndefined(a)||null==a?"":a.toString().trim()},c.encodeHTML=function(a){return c.safeToString(a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},c.handleUndefinedResult=function(a,b){return function(){var c=a.apply(null,arguments);return angular.isUndefined(c)?b:c}},c.replaceSpacesWithDashes=function(a){return c.safeToString(a).replace(/\s/g,"-")},c.isModifierOn=function(a){return a.shiftKey||a.ctrlKey||a.altKey||a.metaKey},c.promisifyValue=function(a){return a=!!angular.isUndefined(a)||a,b[a?"when":"reject"]()},c.simplePubSub=function(){var a={};return{on:function(b,c,d){return b.split(" ").forEach(function(b){a[b]||(a[b]=[]);var e=d?[].unshift:[].push;e.call(a[b],c)}),this},trigger:function(b,d){var e=a[b]||[];return e.every(function(a){return c.handleUndefinedResult(a,!0)(d)}),this}}},c}]),d.run(["$templateCache",function(a){a.put("ngTagsInput/tags-input.html",'<div class="host" tabindex="-1" ng-click="eventHandlers.host.click()" ti-transclude-append><div class="tags" ng-class="{focused: hasFocus}"><ul class="tag-list"><li use-theme class="tag-item" ng-repeat="tag in tagList.items track by track(tag)" ng-class="getTagClass(tag, $index)" ng-click="eventHandlers.tag.click(tag)"><ti-tag-item scope="templateScope" data="::tag"></ti-tag-item></li></ul><input class="input" autocomplete="off" ng-model="newTag.text" ng-model-options="{getterSetter: true}" ng-keydown="eventHandlers.input.keydown($event)" ng-focus="eventHandlers.input.focus($event)" ng-blur="eventHandlers.input.blur($event)" ng-paste="eventHandlers.input.paste($event)" ng-trim="false" ng-class="{\'invalid-tag\': newTag.invalid}" ng-disabled="disabled" ti-bind-attrs="{type: options.type, placeholder: options.placeholder, tabindex: options.tabindex, spellcheck: options.spellcheck}" ti-autosize></div></div>'),a.put("ngTagsInput/tag-item.html",'<span ng-bind="$getDisplayText()"></span> <a class="remove-button" ng-click="$removeTag()" ng-bind="::$$removeTagSymbol"></a>'),a.put("ngTagsInput/auto-complete.html",'<div class="autocomplete" ng-if="suggestionList.visible"><ul class="suggestion-list"><li class="suggestion-item" ng-repeat="item in suggestionList.items track by track(item)" ng-class="getSuggestionClass(item, $index)" ng-click="addSuggestionByIndex($index)" ng-mouseenter="suggestionList.select($index)"><ti-autocomplete-match scope="templateScope" data="::item"></ti-autocomplete-match></li></ul></div>'),a.put("ngTagsInput/auto-complete-match.html",'<span ng-bind-html="$highlight($getDisplayText())"></span>')}])}(),angular.module("xeditable",[]).value("editableOptions",{theme:"default",icon_set:"default",buttons:"right",blurElem:"cancel",blurForm:"ignore",activate:"focus",isDisabled:!1,activationEvent:"click"}),angular.module("xeditable").directive("editableBsdate",["editableDirectiveFactory",function(a){return a({directiveName:"editableBsdate",inputTpl:"<div></div>",render:function(){this.parent.render.call(this);var a=angular.element('<input type="text" class="form-control" data-ng-model="$parent.$data"/>');a.attr("uib-datepicker-popup",this.attrs.eDatepickerPopupXEditable||"yyyy/MM/dd"),a.attr("is-open",this.attrs.eIsOpen),a.attr("date-disabled",this.attrs.eDateDisabled),a.attr("uib-datepicker-popup",this.attrs.eDatepickerPopup),a.attr("year-range",this.attrs.eYearRange||20),a.attr("show-button-bar",this.attrs.eShowButtonBar||!0),a.attr("current-text",this.attrs.eCurrentText||"Today"),a.attr("clear-text",this.attrs.eClearText||"Clear"),a.attr("close-text",this.attrs.eCloseText||"Done"),a.attr("close-on-date-selection",this.attrs.eCloseOnDateSelection||!0),a.attr("datepicker-append-to-body",this.attrs.eDatePickerAppendToBody||!1),a.attr("date-disabled",this.attrs.eDateDisabled),a.attr("name",this.attrs.eName),a.attr("on-open-focus",this.attrs.eOnOpenFocus||!0),a.attr("ng-readonly",this.attrs.eReadonly||!1),this.attrs.eNgChange&&(a.attr("ng-change",this.attrs.eNgChange),this.inputEl.removeAttr("ng-change")),this.attrs.eStyle&&(a.attr("style",this.attrs.eStyle),this.inputEl.removeAttr("style")),this.scope.dateOptions={formatDay:this.attrs.eFormatDay||"dd",formatMonth:this.attrs.eFormatMonth||"MMMM",formatYear:this.attrs.eFormatYear||"yyyy",formatDayHeader:this.attrs.eFormatDayHeader||"EEE",formatDayTitle:this.attrs.eFormatDayTitle||"MMMM yyyy",formatMonthTitle:this.attrs.eFormatMonthTitle||"yyyy",showWeeks:!this.attrs.eShowWeeks||"true"===this.attrs.eShowWeeks.toLowerCase(),startingDay:this.attrs.eStartingDay||0,minMode:this.attrs.eMinMode||"day",maxMode:this.attrs.eMaxMode||"year",initDate:this.scope.$eval(this.attrs.eInitDate)||new Date,datepickerMode:this.attrs.eDatepickerMode||"day",maxDate:this.scope.$eval(this.attrs.eMaxDate)||null,minDate:this.scope.$eval(this.attrs.eMinDate)||null};var b=angular.isDefined(this.attrs.eShowCalendarButton)?this.attrs.eShowCalendarButton:"true";if("true"===b){var c=angular.element('<button type="button" class="btn btn-default"><i class="glyphicon glyphicon-calendar"></i></button>'),d=angular.element('<span class="input-group-btn"></span>');c.attr("ng-click",this.attrs.eNgClick),d.append(c),this.inputEl.append(d)}else a.attr("ng-click",this.attrs.eNgClick);a.attr("datepicker-options","dateOptions"),this.inputEl.prepend(a),this.inputEl.removeAttr("class"),this.inputEl.removeAttr("ng-click"),this.inputEl.removeAttr("is-open"),this.inputEl.removeAttr("init-date"),this.inputEl.removeAttr("datepicker-popup"),this.inputEl.removeAttr("required"),this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("date-picker-append-to-body"),this.inputEl.removeAttr("name"),this.inputEl.attr("class","input-group")}})}]),angular.module("xeditable").directive("editableBstime",["editableDirectiveFactory",function(a){return a({directiveName:"editableBstime",inputTpl:"<uib-timepicker></uib-timepicker>",render:function(){this.parent.render.call(this);var a=angular.element('<div class="well well-small" style="display:inline-block;"></div>');a.attr("ng-model",this.inputEl.attr("ng-model")),this.inputEl.removeAttr("ng-model"),this.attrs.eNgChange&&(a.attr("ng-change",this.inputEl.attr("ng-change")),this.inputEl.removeAttr("ng-change")),this.inputEl.wrap(a)}})}]),angular.module("xeditable").directive("editableCheckbox",["editableDirectiveFactory",function(a){return a({directiveName:"editableCheckbox",inputTpl:'<input type="checkbox">',render:function(){this.parent.render.call(this),this.attrs.eTitle&&(this.inputEl.wrap("<label></label>"),this.inputEl.parent().append("<span>"+this.attrs.eTitle+"</span>"))},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableChecklist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableChecklist",inputTpl:"<span></span>",useCopy:!0,render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='<label ng-repeat="'+a.ngRepeat+'"><input type="checkbox" checklist-model="$parent.$parent.$data" checklist-value="'+a.locals.valueFn+'"><span ng-bind="'+a.locals.displayFn+'"></span></label>';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)}})}]),angular.module("xeditable").directive("editableCombodate",["editableDirectiveFactory","editableCombodate",function(a,b){return a({directiveName:"editableCombodate",inputTpl:'<input type="text">',render:function(){this.parent.render.call(this);var a={value:new Date(this.scope.$data)},c=this;angular.forEach(["format","template","minYear","maxYear","yearDescending","minuteStep","secondStep","firstItem","errorClass","customClass","roundTime","smartDays"],function(b){var d="e"+b.charAt(0).toUpperCase()+b.slice(1);d in c.attrs&&(a[b]=c.attrs[d])});var d=b.getInstance(this.inputEl,a);d.$widget.find("select").bind("change",function(a){c.scope.$data=new Date(d.getValue()).toISOString()})}})}]),function(){var a=function(a){return a.toLowerCase().replace(/-(.)/g,function(a,b){return b.toUpperCase()})},b="text|password|email|tel|number|url|search|color|date|datetime|datetime-local|time|month|week|file".split("|");angular.forEach(b,function(b){var c=a("editable-"+b);angular.module("xeditable").directive(c,["editableDirectiveFactory",function(a){return a({directiveName:c,inputTpl:'<input type="'+b+'">',render:function(){if(this.parent.render.call(this),this.attrs.eLabel){var a=angular.element("<label>"+this.attrs.eLabel+"</label>");this.inputEl.parent().prepend(a)}this.attrs.eFormclass&&this.editorEl.addClass(this.attrs.eFormclass)}})}])}),angular.module("xeditable").directive("editableRange",["editableDirectiveFactory",function(a){return a({directiveName:"editableRange",inputTpl:'<input type="range" id="range" name="range">',render:function(){this.parent.render.call(this),this.inputEl.after("<output>{{$data}}</output>")}})}])}(),angular.module("xeditable").directive("editableTagsInput",["editableDirectiveFactory","editableUtils",function(a,b){var c=function(a){for(var b=0,c=d.length;c>b;b++)if(d[b].name===a)return b},d=[],e=a({directiveName:"editableTagsInput",inputTpl:"<tags-input></tags-input>",render:function(){var a=c(this.name);this.parent.render.call(this),this.inputEl.append(b.rename("auto-complete",d[a].element)),this.inputEl.removeAttr("ng-model"),this.inputEl.attr("ng-model","$parent.$data")}}),f=e.link;return e.link=function(a,b,c,e){var g=b.find("editable-tags-input-auto-complete");return d.push({name:c.name||c.editableTagsInput,element:g.clone()}),g.remove(),f(a,b,c,e)},e}]),angular.module("xeditable").directive("editableRadiolist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableRadiolist",inputTpl:"<span></span>",render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='<label data-ng-repeat="'+a.ngRepeat+'"><input type="radio" data-ng-disabled="::'+this.attrs.eNgDisabled+'" data-ng-model="$parent.$parent.$data" value="{{::'+a.locals.valueFn+'}}"><span data-ng-bind="::'+a.locals.displayFn+'"></span></label>';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableSelect",["editableDirectiveFactory",function(a){return a({directiveName:"editableSelect",inputTpl:"<select></select>",render:function(){if(this.parent.render.call(this),this.attrs.ePlaceholder){var a=angular.element('<option value="">'+this.attrs.ePlaceholder+"</option>");this.inputEl.append(a)}},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){a.scope.$apply(function(){a.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableTextarea",["editableDirectiveFactory",function(a){return a({directiveName:"editableTextarea",inputTpl:"<textarea></textarea>",addListeners:function(){var a=this;a.parent.addListeners.call(a),a.single&&"no"!==a.buttons&&a.autosubmit()},autosubmit:function(){var a=this;a.inputEl.bind("keydown",function(b){(b.ctrlKey||b.metaKey)&&13===b.keyCode&&a.scope.$apply(function(){a.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableUiSelect",["editableDirectiveFactory","editableUtils",function(a,b){var c=function(a){for(var b=0,c=d.length;c>b;b++)if(d[b].name===a)return b},d=[],e=[],f=a({directiveName:"editableUiSelect",inputTpl:"<ui-select></ui-select>",render:function(){var a=c(this.name);this.parent.render.call(this),this.inputEl.append(b.rename("ui-select-match",d[a].element)),this.inputEl.append(b.rename("ui-select-choices",e[a].element)),this.inputEl.removeAttr("ng-model"),this.inputEl.attr("ng-model","$parent.$parent.$data")}}),g=f.link;return f.link=function(a,b,c,f){var h=b.find("editable-ui-select-match"),i=b.find("editable-ui-select-choices");return d.push({name:c.name||c.editableUiSelect,element:h.clone()}),e.push({name:c.name||c.editableUiSelect,element:i.clone()}),h.remove(),i.remove(),g(a,b,c,f)},f}]),angular.module("xeditable").factory("editableController",["$q","editableUtils",function(a,b){function c(a,c,d,e,f,g,h,i,j,k){var l,m,n=this;n.scope=a,n.elem=d,n.attrs=c,n.inputEl=null,n.editorEl=null,n.single=!0,n.error="",n.theme=f[c.editableTheme]||f[h.theme]||f.default,n.parent={},n.icon_set="default"===h.icon_set?g.default[h.theme]:g.external[h.icon_set],n.inputTpl="",n.directiveName="",n.useCopy=!1,n.single=null,n.buttons="right",n.init=function(b){if(n.single=b,n.name=c.eName||c[n.directiveName],!c[n.directiveName])throw"You should provide value for `"+n.directiveName+"` in editable element!";l=e(c[n.directiveName]),n.single?n.buttons=n.attrs.buttons||h.buttons:n.buttons="no",c.eName&&n.scope.$watch("$data",function(a){n.scope.$form.$data[c.eName]=a}),c.onshow&&(n.onshow=function(){return n.catchError(e(c.onshow)(a))}),c.onhide&&(n.onhide=function(){return e(c.onhide)(a)}),c.oncancel&&(n.oncancel=function(){return e(c.oncancel)(a)}),c.onbeforesave&&(n.onbeforesave=function(){return n.catchError(e(c.onbeforesave)(a))}),c.onaftersave&&(n.onaftersave=function(){return n.catchError(e(c.onaftersave)(a))}),a.$parent.$watch(c[n.directiveName],function(a,b){n.setLocalValue(),n.handleEmpty()})},n.render=function(){var a=n.theme;n.inputEl=angular.element(n.inputTpl),n.controlsEl=angular.element(a.controlsTpl),n.controlsEl.append(n.inputEl),"no"!==n.buttons&&(n.buttonsEl=angular.element(a.buttonsTpl),n.submitEl=angular.element(a.submitTpl),n.cancelEl=angular.element(a.cancelTpl),n.icon_set&&(n.submitEl.find("span").addClass(n.icon_set.ok),n.cancelEl.find("span").addClass(n.icon_set.cancel)),n.buttonsEl.append(n.submitEl).append(n.cancelEl),n.controlsEl.append(n.buttonsEl),n.inputEl.addClass("editable-has-buttons")),n.errorEl=angular.element(a.errorTpl),n.controlsEl.append(n.errorEl),n.editorEl=angular.element(n.single?a.formTpl:a.noformTpl),n.editorEl.append(n.controlsEl);for(var d in c.$attr)if(!(d.length<=1)){var e=!1,f=d.substring(1,2);if("e"===d.substring(0,1)&&f===f.toUpperCase()&&(e=d.substring(1),"Form"!==e&&"NgSubmit"!==e)){e=e.substring(0,1).toLowerCase()+b.camelToDash(e.substring(1));var g="value"!==e&&""===c[d]?e:c[d];n.inputEl.attr(e,g)}}n.inputEl.addClass("editable-input"),n.inputEl.attr("ng-model","$parent.$data"),n.editorEl.addClass(b.camelToDash(n.directiveName)),n.single&&(n.editorEl.attr("editable-form","$form"),n.editorEl.attr("blur",n.attrs.blur||("no"===n.buttons?"cancel":h.blurElem))),angular.isFunction(a.postrender)&&a.postrender.call(n)},n.setLocalValue=function(){n.scope.$data=n.useCopy?angular.copy(l(a.$parent)):l(a.$parent)};var o=null;n.show=function(){return n.setLocalValue(),n.render(),d.after(n.editorEl),o=a.$new(),j(n.editorEl)(o),n.addListeners(),d.addClass("editable-hide"),n.onshow()},n.hide=function(){return o.$destroy(),n.controlsEl.remove(),n.editorEl.remove(),d.removeClass("editable-hide"),n.onhide()},n.cancel=function(){n.oncancel()},n.addListeners=function(){n.inputEl.bind("keyup",function(a){if(n.single)switch(a.keyCode){case 27:n.scope.$apply(function(){n.scope.$form.$cancel()})}}),n.single&&"no"===n.buttons&&n.autosubmit(),n.editorEl.bind("click",function(a){a.which&&1!==a.which||n.scope.$form.$visible&&(n.scope.$form._clicked=!0)})},n.setWaiting=function(a){a?(m=!n.inputEl.attr("disabled")&&!n.inputEl.attr("ng-disabled")&&!n.inputEl.attr("ng-enabled"),m&&(n.inputEl.attr("disabled","disabled"),n.buttonsEl&&n.buttonsEl.find("button").attr("disabled","disabled"))):m&&(n.inputEl.removeAttr("disabled"),n.buttonsEl&&n.buttonsEl.find("button").removeAttr("disabled"))},n.activate=function(a,b){setTimeout(function(){var c=n.inputEl[0];"focus"===h.activate&&c.focus&&(a&&(b=b||a,c.onfocus=function(){var c=this;setTimeout(function(){c.setSelectionRange(a,b)})}),c.focus()),"select"===h.activate&&c.select&&c.select()},0)},n.setError=function(b){angular.isObject(b)||(a.$error=b,n.error=b)},n.catchError=function(a,b){return angular.isObject(a)&&b!==!0?k.when(a).then(angular.bind(this,function(a){this.catchError(a,!0)}),angular.bind(this,function(a){this.catchError(a,!0)})):b&&angular.isObject(a)&&a.status&&200!==a.status&&a.data&&angular.isString(a.data)?(this.setError(a.data),a=a.data):angular.isString(a)&&this.setError(a),
a},n.save=function(){l.assign(a.$parent,n.useCopy?angular.copy(n.scope.$data):n.scope.$data)},n.handleEmpty=function(){var b=l(a.$parent),c=null===b||void 0===b||""===b||angular.isArray(b)&&0===b.length;d.toggleClass("editable-empty",c)},n.autosubmit=angular.noop,n.onshow=angular.noop,n.onhide=angular.noop,n.oncancel=angular.noop,n.onbeforesave=angular.noop,n.onaftersave=angular.noop}return c.$inject=["$scope","$attrs","$element","$parse","editableThemes","editableIcons","editableOptions","$rootScope","$compile","$q"],c}]),angular.module("xeditable").factory("editableDirectiveFactory",["$parse","$compile","editableThemes","$rootScope","$document","editableController","editableFormController","editableOptions",function(a,b,c,d,e,f,g,h){return function(b){return{restrict:"A",scope:!0,require:[b.directiveName,"?^form"],controller:f,link:function(c,f,i,j){var k,l=j[0],m=!1;if(j[1])k=j[1],m=void 0===i.eSingle;else if(i.eForm){var n=a(i.eForm)(c);if(n)k=n,m=!0;else if(f&&"function"==typeof f.parents&&f.parents().last().find("form[name="+i.eForm+"]").length)k=null,m=!0;else for(var o=0;o<e[0].forms.length;o++)if(e[0].forms[o].name===i.eForm){k=null,m=!0;break}}angular.forEach(b,function(a,b){void 0!==l[b]&&(l.parent[b]=l[b])}),angular.extend(l,b);var p=angular.isDefined(i.editDisabled)?c.$eval(i.editDisabled):h.isDisabled;if(!p)if(l.init(!m),c.$editable=l,f.addClass("editable"),m)if(k){if(c.$form=k,!c.$form.$addEditable)throw"Form with editable elements should have `editable-form` attribute.";c.$form.$addEditable(l)}else d.$$editableBuffer=d.$$editableBuffer||{},d.$$editableBuffer[i.eForm]=d.$$editableBuffer[i.eForm]||[],d.$$editableBuffer[i.eForm].push(l),c.$form=null;else c.$form=g(),c.$form.$addEditable(l),i.eForm&&(a(i.eForm).assign||angular.noop)(c.$parent,c.$form),(!i.eForm||i.eClickable)&&(f.addClass("editable-click"),f.bind(h.activationEvent,function(a){a.preventDefault(),a.editable=l,c.$apply(function(){c.$form.$show()})}))}}}}]),angular.module("xeditable").factory("editableFormController",["$parse","$document","$rootScope","editablePromiseCollection","editableUtils",function(a,b,c,d,e){var f=[],g=function(a,b){if(b==a)return!0;for(var c=b.parentNode;null!==c;){if(c==a)return!0;c=c.parentNode}return!1},h=function(a,b){var c=!0,d=a.$editables;return angular.forEach(d,function(a){var d=a.editorEl[0];g(d,b.target)&&(c=!1)}),c};b.bind("click",function(a){if(!a.which||1===a.which){for(var b=[],d=[],e=0;e<f.length;e++)f[e]._clicked?f[e]._clicked=!1:f[e].$waiting||("cancel"===f[e]._blur&&h(f[e],a)&&b.push(f[e]),"submit"===f[e]._blur&&h(f[e],a)&&d.push(f[e]));(b.length||d.length)&&c.$apply(function(){angular.forEach(b,function(a){a.$cancel()}),angular.forEach(d,function(a){a.$submit()})})}}),c.$on("closeEdit",function(){for(var a=0;a<f.length;a++)f[a].$hide()});var i={$addEditable:function(a){this.$editables.push(a),a.elem.bind("$destroy",angular.bind(this,this.$removeEditable,a)),a.scope.$form||(a.scope.$form=this),this.$visible&&a.catchError(a.show()),a.catchError(a.setWaiting(this.$waiting))},$removeEditable:function(a){for(var b=0;b<this.$editables.length;b++)if(this.$editables[b]===a)return void this.$editables.splice(b,1)},$show:function(){if(!this.$visible){this.$visible=!0;var a=d();a.when(this.$onshow()),this.$setError(null,""),angular.forEach(this.$editables,function(b){a.when(b.show())}),a.then({onWait:angular.bind(this,this.$setWaiting),onTrue:angular.bind(this,this.$activate),onFalse:angular.bind(this,this.$activate),onString:angular.bind(this,this.$activate)}),setTimeout(angular.bind(this,function(){this._clicked=!1,-1===e.indexOf(f,this)&&f.push(this)}),0)}},$activate:function(a){var b;if(this.$editables.length){if(angular.isString(a))for(b=0;b<this.$editables.length;b++)if(this.$editables[b].name===a)return void this.$editables[b].activate();for(b=0;b<this.$editables.length;b++)if(this.$editables[b].error)return void this.$editables[b].activate();this.$editables[0].activate(this.$editables[0].elem[0].selectionStart,this.$editables[0].elem[0].selectionEnd)}},$hide:function(){this.$visible&&(this.$visible=!1,this.$onhide(),angular.forEach(this.$editables,function(a){a.hide()}),e.arrayRemove(f,this))},$cancel:function(){this.$visible&&(this.$oncancel(),angular.forEach(this.$editables,function(a){a.cancel()}),this.$hide())},$setWaiting:function(a){this.$waiting=!!a,angular.forEach(this.$editables,function(b){b.setWaiting(!!a)})},$setError:function(a,b){angular.forEach(this.$editables,function(c){a&&c.name!==a||c.setError(b)})},$submit:function(){function a(a){var b=d();b.when(this.$onbeforesave()),b.then({onWait:angular.bind(this,this.$setWaiting),onTrue:a?angular.bind(this,this.$save):angular.bind(this,this.$hide),onFalse:angular.bind(this,this.$hide),onString:angular.bind(this,this.$activate)})}if(!this.$waiting){this.$setError(null,"");var b=d();angular.forEach(this.$editables,function(a){b.when(a.onbeforesave())}),b.then({onWait:angular.bind(this,this.$setWaiting),onTrue:angular.bind(this,a,!0),onFalse:angular.bind(this,a,!1),onString:angular.bind(this,this.$activate)})}},$save:function(){angular.forEach(this.$editables,function(a){a.save()});var a=d();a.when(this.$onaftersave()),angular.forEach(this.$editables,function(b){a.when(b.onaftersave())}),a.then({onWait:angular.bind(this,this.$setWaiting),onTrue:angular.bind(this,this.$hide),onFalse:angular.bind(this,this.$hide),onString:angular.bind(this,this.$activate)})},$onshow:angular.noop,$oncancel:angular.noop,$onhide:angular.noop,$onbeforesave:angular.noop,$onaftersave:angular.noop};return function(){return angular.extend({$editables:[],$visible:!1,$waiting:!1,$data:{},_clicked:!1,_blur:null},i)}}]),angular.module("xeditable").directive("editableForm",["$rootScope","$parse","editableFormController","editableOptions",function(a,b,c,d){return{restrict:"A",require:["form"],compile:function(){return{pre:function(b,d,e,f){var g,h=f[0];e.editableForm?b[e.editableForm]&&b[e.editableForm].$show?(g=b[e.editableForm],angular.extend(h,g)):(g=c(),b[e.editableForm]=g,angular.extend(g,h)):(g=c(),angular.extend(h,g));var i=a.$$editableBuffer,j=h.$name;j&&i&&i[j]&&(angular.forEach(i[j],function(a){g.$addEditable(a)}),delete i[j])},post:function(a,c,e,f){var g;g=e.editableForm&&a[e.editableForm]&&a[e.editableForm].$show?a[e.editableForm]:f[0],e.onshow&&(g.$onshow=angular.bind(g,b(e.onshow),a)),e.onhide&&(g.$onhide=angular.bind(g,b(e.onhide),a)),e.oncancel&&(g.$oncancel=angular.bind(g,b(e.oncancel),a)),e.shown&&b(e.shown)(a)&&g.$show(),g._blur=e.blur||d.blurForm,e.ngSubmit||e.submit||(e.onbeforesave&&(g.$onbeforesave=function(){return b(e.onbeforesave)(a,{$data:g.$data})}),e.onaftersave&&(g.$onaftersave=function(){return b(e.onaftersave)(a,{$data:g.$data})}),c.bind("submit",function(b){b.preventDefault(),a.$apply(function(){g.$submit()})})),c.bind("click",function(a){a.which&&1!==a.which||g.$visible&&(g._clicked=!0)})}}}}}]),angular.module("xeditable").factory("editablePromiseCollection",["$q",function(a){function b(){return{promises:[],hasFalse:!1,hasString:!1,when:function(b,c){if(b===!1)this.hasFalse=!0;else if(!c&&angular.isObject(b))this.promises.push(a.when(b));else{if(!angular.isString(b))return;this.hasString=!0}},then:function(b){function c(){h.hasString||h.hasFalse?!h.hasString&&h.hasFalse?e():f():d()}b=b||{};var d=b.onTrue||angular.noop,e=b.onFalse||angular.noop,f=b.onString||angular.noop,g=b.onWait||angular.noop,h=this;this.promises.length?(g(!0),a.all(this.promises).then(function(a){g(!1),angular.forEach(a,function(a){h.when(a,!0)}),c()},function(a){g(!1),f()})):c()}}}return b}]),angular.module("xeditable").factory("editableUtils",[function(){return{indexOf:function(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0;c<a.length;c++)if(b===a[c])return c;return-1},arrayRemove:function(a,b){var c=this.indexOf(a,b);return c>=0&&a.splice(c,1),b},camelToDash:function(a){var b=/[A-Z]/g;return a.replace(b,function(a,b){return(b?"-":"")+a.toLowerCase()})},dashToCamel:function(a){var b=/([\:\-\_]+(.))/g,c=/^moz([A-Z])/;return a.replace(b,function(a,b,c,d){return d?c.toUpperCase():c}).replace(c,"Moz$1")},rename:function(a,b){var c=angular.element("<"+a+"/>");c.html(b.html());for(var d=b[0].attributes,e=0;e<d.length;++e)c.attr(d.item(e).nodeName,d.item(e).value);return c}}}]),angular.module("xeditable").factory("editableNgOptionsParser",[function(){function a(a){var c;if(!(c=a.match(b)))throw"ng-options parse error";var d,e=c[2]||c[1],f=c[4]||c[6],g=c[5],h=(c[3]||"",c[2]?c[1]:f),i=c[7],j=c[8],k=j?c[8]:null;return void 0===g?(d=f+" in "+i,void 0!==j&&(d+=" track by "+k)):d="("+g+", "+f+") in "+i,{ngRepeat:d,locals:{valueName:f,keyName:g,valueFn:h,displayFn:e}}}var b=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/;return a}]),angular.module("xeditable").factory("editableCombodate",[function(){function a(a,b){if(this.$element=angular.element(a),"INPUT"!=this.$element[0].nodeName)throw"Combodate should be applied to INPUT element";var c=(new Date).getFullYear();this.defaults={format:"YYYY-MM-DD HH:mm",template:"D / MMM / YYYY H : mm",value:null,minYear:1970,maxYear:c,yearDescending:!0,minuteStep:5,secondStep:1,firstItem:"empty",errorClass:null,customClass:"",roundTime:!0,smartDays:!0},this.options=angular.extend({},this.defaults,b),this.init()}return a.prototype={constructor:a,init:function(){if(this.map={day:["D","date"],month:["M","month"],year:["Y","year"],hour:["[Hh]","hours"],minute:["m","minutes"],second:["s","seconds"],ampm:["[Aa]",""]},this.$widget=angular.element('<span class="combodate"></span>').html(this.getTemplate()),this.initCombos(),this.options.smartDays){var a=this;this.$widget.find("select").bind("change",function(b){(angular.element(b.target).hasClass("month")||angular.element(b.target).hasClass("year"))&&a.fillCombo("day")})}this.$widget.find("select").css("width","auto"),this.$element.css("display","none").after(this.$widget),this.setValue(this.$element.val()||this.options.value)},getTemplate:function(){var a=this.options.template,b=this.options.customClass;return angular.forEach(this.map,function(b,c){b=b[0];var d=new RegExp(b+"+"),e=b.length>1?b.substring(1,2):b;a=a.replace(d,"{"+e+"}")}),a=a.replace(/ /g,"&nbsp;"),angular.forEach(this.map,function(c,d){c=c[0];var e=c.length>1?c.substring(1,2):c;a=a.replace("{"+e+"}",'<select class="'+d+" "+b+'"></select>')}),a},initCombos:function(){for(var a in this.map){var b=this.$widget[0].querySelectorAll("."+a);this["$"+a]=b.length?angular.element(b):null,this.fillCombo(a)}},fillCombo:function(a){var b=this["$"+a];if(b){var c="fill"+a.charAt(0).toUpperCase()+a.slice(1),d=this[c](),e=b.val();b.html("");for(var f=0;f<d.length;f++)b.append('<option value="'+d[f][0]+'">'+d[f][1]+"</option>");b.val(e)}},fillCommon:function(a){var b,c=[];if("name"===this.options.firstItem){b=moment.relativeTime||moment.langData()._relativeTime;var d="function"==typeof b[a]?b[a](1,!0,a,!1):b[a];d=d.split(" ").reverse()[0],c.push(["",d])}else"empty"===this.options.firstItem&&c.push(["",""]);return c},fillDay:function(){var a,b,c=this.fillCommon("d"),d=-1!==this.options.template.indexOf("DD"),e=31;if(this.options.smartDays&&this.$month&&this.$year){var f=parseInt(this.$month.val(),10),g=parseInt(this.$year.val(),10);isNaN(f)||isNaN(g)||(e=moment([g,f]).daysInMonth())}for(b=1;e>=b;b++)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillMonth:function(){var a,b,c=this.fillCommon("M"),d=-1!==this.options.template.indexOf("MMMM"),e=-1!==this.options.template.indexOf("MMM"),f=-1!==this.options.template.indexOf("MM");for(b=0;11>=b;b++)a=d?moment().date(1).month(b).format("MMMM"):e?moment().date(1).month(b).format("MMM"):f?this.leadZero(b+1):b+1,c.push([b,a]);return c},fillYear:function(){var a,b,c=[],d=-1!==this.options.template.indexOf("YYYY");for(b=this.options.maxYear;b>=this.options.minYear;b--)a=d?b:(b+"").substring(2),c[this.options.yearDescending?"push":"unshift"]([b,a]);return c=this.fillCommon("y").concat(c)},fillHour:function(){var a,b,c=this.fillCommon("h"),d=-1!==this.options.template.indexOf("h"),e=(-1!==this.options.template.indexOf("H"),-1!==this.options.template.toLowerCase().indexOf("hh")),f=d?1:0,g=d?12:23;for(b=f;g>=b;b++)a=e?this.leadZero(b):b,c.push([b,a]);return c},fillMinute:function(){var a,b,c=this.fillCommon("m"),d=-1!==this.options.template.indexOf("mm");for(b=0;59>=b;b+=this.options.minuteStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillSecond:function(){var a,b,c=this.fillCommon("s"),d=-1!==this.options.template.indexOf("ss");for(b=0;59>=b;b+=this.options.secondStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillAmpm:function(){var a=-1!==this.options.template.indexOf("a"),b=(-1!==this.options.template.indexOf("A"),[["am",a?"am":"AM"],["pm",a?"pm":"PM"]]);return b},getValue:function(a){var b,c={},d=this,e=!1;return angular.forEach(this.map,function(a,b){if("ampm"!==b){var f="day"===b?1:0;return c[b]=d["$"+b]?parseInt(d["$"+b].val(),10):f,isNaN(c[b])?(e=!0,!1):void 0}}),e?"":(this.$ampm&&(12===c.hour?c.hour="am"===this.$ampm.val()?0:12:c.hour="am"===this.$ampm.val()?c.hour:c.hour+12),b=moment([c.year,c.month,c.day,c.hour,c.minute,c.second]),this.highlight(b),a=void 0===a?this.options.format:a,null===a?b.isValid()?b:null:b.isValid()?b.format(a):"")},setValue:function(a){function b(a,b){var c={};return angular.forEach(a.children("option"),function(a,d){var e=angular.element(a).attr("value");if(""!==e){var f=Math.abs(e-b);("undefined"==typeof c.distance||f<c.distance)&&(c={value:e,distance:f})}}),c.value}if(a){var c="string"==typeof a?moment(a,this.options.format,!0):moment(a),d=this,e={};c.isValid()&&(angular.forEach(this.map,function(a,b){"ampm"!==b&&(e[b]=c[a[1]]())}),this.$ampm&&(e.hour>=12?(e.ampm="pm",e.hour>12&&(e.hour-=12)):(e.ampm="am",0===e.hour&&(e.hour=12))),angular.forEach(e,function(a,c){d["$"+c]&&("minute"===c&&d.options.minuteStep>1&&d.options.roundTime&&(a=b(d["$"+c],a)),"second"===c&&d.options.secondStep>1&&d.options.roundTime&&(a=b(d["$"+c],a)),d["$"+c].val(a))}),this.options.smartDays&&this.fillCombo("day"),this.$element.val(c.format(this.options.format)).triggerHandler("change"))}},highlight:function(a){a.isValid()?this.options.errorClass?this.$widget.removeClass(this.options.errorClass):this.$widget.find("select").css("border-color",this.borderColor):this.options.errorClass?this.$widget.addClass(this.options.errorClass):(this.borderColor||(this.borderColor=this.$widget.find("select").css("border-color")),this.$widget.find("select").css("border-color","red"))},leadZero:function(a){return 9>=a?"0"+a:a},destroy:function(){this.$widget.remove(),this.$element.removeData("combodate").show()}},{getInstance:function(b,c){return new a(b,c)}}}]),angular.module("xeditable").factory("editableIcons",function(){var a={default:{bs2:{ok:"icon-ok icon-white",cancel:"icon-remove"},bs3:{ok:"glyphicon glyphicon-ok",cancel:"glyphicon glyphicon-remove"}},external:{"font-awesome":{ok:"fa fa-check",cancel:"fa fa-times"}}};return a}),angular.module("xeditable").factory("editableThemes",function(){var a={default:{formTpl:'<form class="editable-wrap"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<span class="editable-controls"></span>',inputTpl:"",errorTpl:'<div class="editable-error" data-ng-if="$error" data-ng-bind="$error"></div>',buttonsTpl:'<span class="editable-buttons"></span>',submitTpl:'<button type="submit">save</button>',cancelTpl:'<button type="button" ng-click="$form.$cancel()">cancel</button>'},bs2:{formTpl:'<form class="form-inline editable-wrap" role="form"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<div class="editable-controls controls control-group" ng-class="{\'error\': $error}"></div>',inputTpl:"",errorTpl:'<div class="editable-error help-block" data-ng-if="$error" data-ng-bind="$error"></div>',buttonsTpl:'<span class="editable-buttons"></span>',submitTpl:'<button type="submit" class="btn btn-primary"><span></span></button>',cancelTpl:'<button type="button" class="btn" ng-click="$form.$cancel()"><span></span></button>'},bs3:{formTpl:'<form class="form-inline editable-wrap" role="form"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<div class="editable-controls form-group" ng-class="{\'has-error\': $error}"></div>',inputTpl:"",errorTpl:'<div class="editable-error help-block" data-ng-if="$error" data-ng-bind="$error"></div>',buttonsTpl:'<span class="editable-buttons"></span>',submitTpl:'<button type="submit" class="btn btn-primary"><span></span></button>',cancelTpl:'<button type="button" class="btn btn-default" ng-click="$form.$cancel()"><span></span></button>',buttonsClass:"",inputClass:"",postrender:function(){switch(this.directiveName){case"editableText":case"editableSelect":case"editableTextarea":case"editableEmail":case"editableTel":case"editableNumber":case"editableUrl":case"editableSearch":case"editableDate":case"editableDatetime":case"editableBsdate":case"editableTime":case"editableMonth":case"editableWeek":case"editablePassword":case"editableDatetimeLocal":if(this.inputEl.addClass("form-control"),this.theme.inputClass){if(this.inputEl.attr("multiple")&&("input-sm"===this.theme.inputClass||"input-lg"===this.theme.inputClass))break;this.inputEl.addClass(this.theme.inputClass)}break;case"editableCheckbox":this.editorEl.addClass("checkbox")}this.buttonsEl&&this.theme.buttonsClass&&this.buttonsEl.find("button").addClass(this.theme.buttonsClass)}},semantic:{formTpl:'<form class="editable-wrap ui form" ng-class="{\'error\': $error}" role="form"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<div class="editable-controls ui fluid input" ng-class="{\'error\': $error}"></div>',inputTpl:"",errorTpl:'<div class="editable-error ui error message" data-ng-if="$error" data-ng-bind="$error"></div>',buttonsTpl:'<span class="mini ui buttons"></span>',submitTpl:'<button type="submit" class="ui primary button"><i class="ui check icon"></i></button>',cancelTpl:'<button type="button" class="ui button" ng-click="$form.$cancel()"><i class="ui cancel icon"></i></button>'}};return a}),function(T){function z(a,c,b){var g=0,f=[0],h="",l=null,h=b||"UTF8";if("UTF8"!==h&&"UTF16"!==h)throw"encoding must be UTF8 or UTF16";if("HEX"===c){if(0!==a.length%2)throw"srcString of HEX type must be in byte increments";l=B(a),g=l.binLen,f=l.value}else if("ASCII"===c||"TEXT"===c)l=J(a,h),g=l.binLen,f=l.value;else{if("B64"!==c)throw"inputFormat must be HEX, TEXT, ASCII, or B64";l=K(a),g=l.binLen,f=l.value}this.getHash=function(a,c,b,h){var p,l=null,d=f.slice(),n=g;if(3===arguments.length?"number"!=typeof b&&(h=b,b=1):2===arguments.length&&(b=1),b!==parseInt(b,10)||1>b)throw"numRounds must a integer >= 1";switch(c){case"HEX":l=L;break;case"B64":l=M;break;default:throw"format must be HEX or B64"}if("SHA-1"===a)for(p=0;p<b;p++)d=y(d,n),n=160;else if("SHA-224"===a)for(p=0;p<b;p++)d=v(d,n,a),n=224;else if("SHA-256"===a)for(p=0;p<b;p++)d=v(d,n,a),n=256;else if("SHA-384"===a)for(p=0;p<b;p++)d=v(d,n,a),n=384;else{if("SHA-512"!==a)throw"Chosen SHA variant is not supported";for(p=0;p<b;p++)d=v(d,n,a),n=512}return l(d,N(h))},this.getHMAC=function(a,b,c,l,s){var d,n,p,m,w=[],x=[];switch(d=null,l){case"HEX":l=L;break;case"B64":l=M;break;default:throw"outputFormat must be HEX or B64"}if("SHA-1"===c)n=64,m=160;else if("SHA-224"===c)n=64,m=224;else if("SHA-256"===c)n=64,m=256;else if("SHA-384"===c)n=128,m=384;else{if("SHA-512"!==c)throw"Chosen SHA variant is not supported";n=128,m=512}if("HEX"===b)d=B(a),p=d.binLen,d=d.value;else if("ASCII"===b||"TEXT"===b)d=J(a,h),p=d.binLen,d=d.value;else{if("B64"!==b)throw"inputFormat must be HEX, TEXT, ASCII, or B64";d=K(a),p=d.binLen,d=d.value}for(a=8*n,b=n/4-1,n<p/8?(d="SHA-1"===c?y(d,p):v(d,p,c),d[b]&=4294967040):n>p/8&&(d[b]&=4294967040),n=0;n<=b;n+=1)w[n]=909522486^d[n],x[n]=1549556828^d[n];return c="SHA-1"===c?y(x.concat(y(w.concat(f),a+g)),a+m):v(x.concat(v(w.concat(f),a+g,c)),a+m,c),l(c,N(s))}}function s(a,c){this.a=a,this.b=c}function J(a,c){var g,l,b=[],f=[],h=0;if("UTF8"===c)for(l=0;l<a.length;l+=1)for(g=a.charCodeAt(l),f=[],2048<g?(f[0]=224|(61440&g)>>>12,f[1]=128|(4032&g)>>>6,f[2]=128|63&g):128<g?(f[0]=192|(1984&g)>>>6,f[1]=128|63&g):f[0]=g,g=0;g<f.length;g+=1)b[h>>>2]|=f[g]<<24-h%4*8,h+=1;else if("UTF16"===c)for(l=0;l<a.length;l+=1)b[h>>>2]|=a.charCodeAt(l)<<16-h%4*8,h+=2;return{value:b,binLen:8*h}}function B(a){var g,f,c=[],b=a.length;if(0!==b%2)throw"String of HEX type must be in byte increments";for(g=0;g<b;g+=2){if(f=parseInt(a.substr(g,2),16),isNaN(f))throw"String of HEX type contains invalid characters";c[g>>>3]|=f<<24-g%8*4}return{value:c,binLen:4*b}}function K(a){var g,f,h,l,r,c=[],b=0;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";if(g=a.indexOf("="),a=a.replace(/\=/g,""),-1!==g&&g<a.length)throw"Invalid '=' found in base-64 string";for(f=0;f<a.length;f+=4){for(r=a.substr(f,4),h=l=0;h<r.length;h+=1)g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(r[h]),l|=g<<18-6*h;for(h=0;h<r.length-1;h+=1)c[b>>2]|=(l>>>16-8*h&255)<<24-b%4*8,b+=1}return{value:c,binLen:8*b}}function L(a,c){var f,h,b="",g=4*a.length;for(f=0;f<g;f+=1)h=a[f>>>2]>>>8*(3-f%4),b+="0123456789abcdef".charAt(h>>>4&15)+"0123456789abcdef".charAt(15&h);return c.outputUpper?b.toUpperCase():b}function M(a,c){var f,h,l,b="",g=4*a.length;for(f=0;f<g;f+=3)for(l=(a[f>>>2]>>>8*(3-f%4)&255)<<16|(a[f+1>>>2]>>>8*(3-(f+1)%4)&255)<<8|a[f+2>>>2]>>>8*(3-(f+2)%4)&255,h=0;4>h;h+=1)b=8*f+6*h<=32*a.length?b+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>>6*(3-h)&63):b+c.b64Pad;return b}function N(a){var c={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(c.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(c.b64Pad=a.b64Pad)}catch(b){}if("boolean"!=typeof c.outputUpper)throw"Invalid outputUpper formatting option";if("string"!=typeof c.b64Pad)throw"Invalid b64Pad formatting option";return c}function U(a,c){return a<<c|a>>>32-c}function u(a,c){return a>>>c|a<<32-c}function t(a,c){var b=null,b=new s(a.a,a.b);return b=32>=c?new s(b.a>>>c|b.b<<32-c&4294967295,b.b>>>c|b.a<<32-c&4294967295):new s(b.b>>>c-32|b.a<<64-c&4294967295,b.a>>>c-32|b.b<<64-c&4294967295)}function O(a,c){var b=null;return b=32>=c?new s(a.a>>>c,a.b>>>c|a.a<<32-c&4294967295):new s(0,a.a>>>c-32)}function V(a,c,b){return a^c^b}function P(a,c,b){return a&c^~a&b}function W(a,c,b){return new s(a.a&c.a^~a.a&b.a,a.b&c.b^~a.b&b.b)}function Q(a,c,b){return a&c^a&b^c&b}function X(a,c,b){return new s(a.a&c.a^a.a&b.a^c.a&b.a,a.b&c.b^a.b&b.b^c.b&b.b)}function Y(a){return u(a,2)^u(a,13)^u(a,22)}function Z(a){var c=t(a,28),b=t(a,34);return a=t(a,39),new s(c.a^b.a^a.a,c.b^b.b^a.b)}function $(a){return u(a,6)^u(a,11)^u(a,25)}function aa(a){var c=t(a,14),b=t(a,18);return a=t(a,41),new s(c.a^b.a^a.a,c.b^b.b^a.b)}function ba(a){return u(a,7)^u(a,18)^a>>>3}function ca(a){var c=t(a,1),b=t(a,8);return a=O(a,7),new s(c.a^b.a^a.a,c.b^b.b^a.b)}function da(a){return u(a,17)^u(a,19)^a>>>10}function ea(a){var c=t(a,19),b=t(a,61);return a=O(a,6),new s(c.a^b.a^a.a,c.b^b.b^a.b)}function R(a,c){var b=(65535&a)+(65535&c);return((a>>>16)+(c>>>16)+(b>>>16)&65535)<<16|65535&b}function fa(a,c,b,g){var f=(65535&a)+(65535&c)+(65535&b)+(65535&g);return((a>>>16)+(c>>>16)+(b>>>16)+(g>>>16)+(f>>>16)&65535)<<16|65535&f}function S(a,c,b,g,f){var h=(65535&a)+(65535&c)+(65535&b)+(65535&g)+(65535&f);return((a>>>16)+(c>>>16)+(b>>>16)+(g>>>16)+(f>>>16)+(h>>>16)&65535)<<16|65535&h}function ga(a,c){var b,g,f;return b=(65535&a.b)+(65535&c.b),g=(a.b>>>16)+(c.b>>>16)+(b>>>16),f=(65535&g)<<16|65535&b,b=(65535&a.a)+(65535&c.a)+(g>>>16),g=(a.a>>>16)+(c.a>>>16)+(b>>>16),new s((65535&g)<<16|65535&b,f)}function ha(a,c,b,g){var f,h,l;return f=(65535&a.b)+(65535&c.b)+(65535&b.b)+(65535&g.b),h=(a.b>>>16)+(c.b>>>16)+(b.b>>>16)+(g.b>>>16)+(f>>>16),l=(65535&h)<<16|65535&f,f=(65535&a.a)+(65535&c.a)+(65535&b.a)+(65535&g.a)+(h>>>16),h=(a.a>>>16)+(c.a>>>16)+(b.a>>>16)+(g.a>>>16)+(f>>>16),new s((65535&h)<<16|65535&f,l)}function ia(a,c,b,g,f){var h,l,r;return h=(65535&a.b)+(65535&c.b)+(65535&b.b)+(65535&g.b)+(65535&f.b),l=(a.b>>>16)+(c.b>>>16)+(b.b>>>16)+(g.b>>>16)+(f.b>>>16)+(h>>>16),r=(65535&l)<<16|65535&h,h=(65535&a.a)+(65535&c.a)+(65535&b.a)+(65535&g.a)+(65535&f.a)+(l>>>16),l=(a.a>>>16)+(c.a>>>16)+(b.a>>>16)+(g.a>>>16)+(f.a>>>16)+(h>>>16),new s((65535&l)<<16|65535&h,r)}function y(a,c){var g,f,h,l,r,s,p,m,x,b=[],u=P,t=V,v=Q,d=U,n=R,w=S,q=[1732584193,4023233417,2562383102,271733878,3285377520];for(a[c>>>5]|=128<<24-c%32,a[(c+65>>>9<<4)+15]=c,x=a.length,p=0;p<x;p+=16){for(g=q[0],f=q[1],h=q[2],l=q[3],r=q[4],m=0;80>m;m+=1)b[m]=16>m?a[m+p]:d(b[m-3]^b[m-8]^b[m-14]^b[m-16],1),s=20>m?w(d(g,5),u(f,h,l),r,1518500249,b[m]):40>m?w(d(g,5),t(f,h,l),r,1859775393,b[m]):60>m?w(d(g,5),v(f,h,l),r,2400959708,b[m]):w(d(g,5),t(f,h,l),r,3395469782,b[m]),r=l,l=h,h=d(f,30),f=g,g=s;q[0]=n(g,q[0]),q[1]=n(f,q[1]),q[2]=n(h,q[2]),q[3]=n(l,q[3]),q[4]=n(r,q[4])}return q}function v(a,c,b){var g,f,h,l,r,t,u,v,z,d,n,p,m,w,x,q,y,C,D,E,F,G,H,I,e,B,A=[],k=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];if(d=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],f=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],"SHA-224"===b||"SHA-256"===b)n=64,g=(c+65>>>9<<4)+15,w=16,x=1,e=Number,q=R,y=fa,C=S,D=ba,E=da,F=Y,G=$,I=Q,H=P,d="SHA-224"===b?d:f;else{if("SHA-384"!==b&&"SHA-512"!==b)throw"Unexpected error in SHA-2 implementation";n=80,g=(c+128>>>10<<5)+31,w=32,x=2,e=s,q=ga,y=ha,C=ia,D=ca,E=ea,F=Z,G=aa,I=X,H=W,k=[new e(k[0],3609767458),new e(k[1],602891725),new e(k[2],3964484399),new e(k[3],2173295548),new e(k[4],4081628472),new e(k[5],3053834265),new e(k[6],2937671579),new e(k[7],3664609560),new e(k[8],2734883394),new e(k[9],1164996542),new e(k[10],1323610764),new e(k[11],3590304994),new e(k[12],4068182383),new e(k[13],991336113),new e(k[14],633803317),new e(k[15],3479774868),new e(k[16],2666613458),new e(k[17],944711139),new e(k[18],2341262773),new e(k[19],2007800933),new e(k[20],1495990901),new e(k[21],1856431235),new e(k[22],3175218132),new e(k[23],2198950837),new e(k[24],3999719339),new e(k[25],766784016),new e(k[26],2566594879),new e(k[27],3203337956),new e(k[28],1034457026),new e(k[29],2466948901),new e(k[30],3758326383),new e(k[31],168717936),new e(k[32],1188179964),new e(k[33],1546045734),new e(k[34],1522805485),new e(k[35],2643833823),new e(k[36],2343527390),new e(k[37],1014477480),new e(k[38],1206759142),new e(k[39],344077627),new e(k[40],1290863460),new e(k[41],3158454273),new e(k[42],3505952657),new e(k[43],106217008),new e(k[44],3606008344),new e(k[45],1432725776),new e(k[46],1467031594),new e(k[47],851169720),new e(k[48],3100823752),new e(k[49],1363258195),new e(k[50],3750685593),new e(k[51],3785050280),new e(k[52],3318307427),new e(k[53],3812723403),new e(k[54],2003034995),new e(k[55],3602036899),new e(k[56],1575990012),new e(k[57],1125592928),new e(k[58],2716904306),new e(k[59],442776044),new e(k[60],593698344),new e(k[61],3733110249),new e(k[62],2999351573),new e(k[63],3815920427),new e(3391569614,3928383900),new e(3515267271,566280711),new e(3940187606,3454069534),new e(4118630271,4000239992),new e(116418474,1914138554),new e(174292421,2731055270),new e(289380356,3203993006),new e(460393269,320620315),new e(685471733,587496836),new e(852142971,1086792851),new e(1017036298,365543100),new e(1126000580,2618297676),new e(1288033470,3409855158),new e(1501505948,4234509866),new e(1607167915,987167468),new e(1816402316,1246189591)],d="SHA-384"===b?[new e(3418070365,d[0]),new e(1654270250,d[1]),new e(2438529370,d[2]),new e(355462360,d[3]),new e(1731405415,d[4]),new e(41048885895,d[5]),new e(3675008525,d[6]),new e(1203062813,d[7])]:[new e(f[0],4089235720),new e(f[1],2227873595),new e(f[2],4271175723),new e(f[3],1595750129),new e(f[4],2917565137),new e(f[5],725511199),new e(f[6],4215389547),new e(f[7],327033209)]}for(a[c>>>5]|=128<<24-c%32,a[g]=c,B=a.length,p=0;p<B;p+=w){for(c=d[0],g=d[1],f=d[2],h=d[3],l=d[4],r=d[5],t=d[6],u=d[7],m=0;m<n;m+=1)A[m]=16>m?new e(a[m*x+p],a[m*x+p+1]):y(E(A[m-2]),A[m-7],D(A[m-15]),A[m-16]),v=C(u,G(l),H(l,r,t),k[m],A[m]),z=q(F(c),I(c,g,f)),u=t,t=r,r=l,l=q(h,v),h=f,f=g,g=c,c=q(v,z);d[0]=q(c,d[0]),d[1]=q(g,d[1]),d[2]=q(f,d[2]),d[3]=q(h,d[3]),d[4]=q(l,d[4]),d[5]=q(r,d[5]),d[6]=q(t,d[6]),d[7]=q(u,d[7])}if("SHA-224"===b)a=[d[0],d[1],d[2],d[3],d[4],d[5],d[6]];else if("SHA-256"===b)a=d;else if("SHA-384"===b)a=[d[0].a,d[0].b,d[1].a,d[1].b,d[2].a,d[2].b,d[3].a,d[3].b,d[4].a,d[4].b,d[5].a,d[5].b];else{if("SHA-512"!==b)throw"Unexpected error in SHA-2 implementation";a=[d[0].a,d[0].b,d[1].a,d[1].b,d[2].a,d[2].b,d[3].a,d[3].b,d[4].a,d[4].b,d[5].a,d[5].b,d[6].a,d[6].b,d[7].a,d[7].b]}return a}"function"!=typeof define||(define.amd,0)?"undefined"!=typeof exports?"undefined"!=typeof module&&module.exports?module.exports=exports=z:exports=z:T.jsSHA=z:define(function(){return z})}(this),_aa={},_aa._ab=function(f,e){for(var d=qrcode.width,b=qrcode.height,c=!0,g=0;g<e.Length&&c;g+=2){var a=Math.floor(e[g]),h=Math.floor(e[g+1]);if(a<-1||a>d||h<-1||h>b)throw"Error._ab ";c=!1,a==-1?(e[g]=0,c=!0):a==d&&(e[g]=d-1,c=!0),h==-1?(e[g+1]=0,c=!0):h==b&&(e[g+1]=b-1,c=!0)}c=!0;for(var g=e.Length-2;g>=0&&c;g-=2){var a=Math.floor(e[g]),h=Math.floor(e[g+1]);if(a<-1||a>d||h<-1||h>b)throw"Error._ab ";c=!1,a==-1?(e[g]=0,c=!0):a==d&&(e[g]=d-1,c=!0),h==-1?(e[g+1]=0,c=!0):h==b&&(e[g+1]=b-1,c=!0)}},_aa._af=function(b,d,a){for(var l=new _ac(d),k=new Array(d<<1),g=0;g<d;g++){for(var h=k.length,j=g+.5,i=0;i<h;i+=2)k[i]=(i>>1)+.5,k[i+1]=j;a._ad(k),_aa._ab(b,k);try{for(var i=0;i<h;i+=2){var e=4*Math.floor(k[i])+Math.floor(k[i+1])*qrcode.width*4,f=b[Math.floor(k[i])+qrcode.width*Math.floor(k[i+1])];qrcode.imagedata.data[e]=f?255:0,qrcode.imagedata.data[e+1]=f?255:0,qrcode.imagedata.data[e+2]=0,qrcode.imagedata.data[e+3]=255,f&&l._dq(i>>1,g)}}catch(c){throw"Error._ab"}}return l},_aa._ah=function(h,o,l,k,r,q,b,a,f,e,n,m,t,s,d,c,j,i){var g=_ae._ag(l,k,r,q,b,a,f,e,n,m,t,s,d,c,j,i);return _aa._af(h,o,g)},_a3._bv=new Array(31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017),_a3.VERSIONS=_ay(),_a3._av=function(a){if(a<1||a>40)throw"bad arguments";return _a3.VERSIONS[a-1]},_a3._at=function(b){if(b%4!=1)throw"Error _at";try{return _a3._av(b-17>>2)}catch(a){throw"Error _av"}},_a3._aw=function(d){for(var b=4294967295,f=0,c=0;c<_a3._bv.length;c++){var a=_a3._bv[c];if(a==d)return this._av(c+7);var e=_ax._gj(d,a);e<b&&(f=c+7,b=e)}return b<=3?this._av(f):null},_ae._ag=function(q,e,o,d,n,c,m,b,h,r,l,f,a,j,i,s){var g=this._be(q,e,o,d,n,c,m,b),k=this._bf(h,r,l,f,a,j,i,s);return k.times(g)},_ae._bf=function(f,h,d,g,b,e,a,c){return dy2=c-e,dy3=h-g+e-c,0==dy2&&0==dy3?new _ae(d-f,b-d,f,g-h,e-g,h,0,0,1):(dx1=d-b,dx2=a-b,dx3=f-d+b-a,dy1=g-e,_dr=dx1*dy2-dx2*dy1,a13=(dx3*dy2-dx2*dy3)/_dr,a23=(dx1*dy3-dx3*dy1)/_dr,new _ae(d-f+a13*d,a-f+a23*a,f,g-h+a13*g,c-h+a23*c,h,a13,a23,1))},_ae._be=function(f,h,d,g,b,e,a,c){return this._bf(f,h,d,g,b,e,a,c)._fr()};var _ca=21522,_cb=new Array(new Array(21522,0),new Array(20773,1),new Array(24188,2),new Array(23371,3),new Array(17913,4),new Array(16590,5),new Array(20375,6),new Array(19104,7),new Array(30660,8),new Array(29427,9),new Array(32170,10),new Array(30877,11),new Array(26159,12),new Array(25368,13),new Array(27713,14),new Array(26998,15),new Array(5769,16),new Array(5054,17),new Array(7399,18),new Array(6608,19),new Array(1890,20),new Array(597,21),new Array(3340,22),new Array(2107,23),new Array(13663,24),new Array(12392,25),new Array(16177,26),new Array(14854,27),new Array(9396,28),new Array(8579,29),new Array(11994,30),new Array(11245,31)),_ch=new Array(0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4);
-_ax._gj=function(d,c){return d^=c,_ch[15&d]+_ch[15&_ew(d,4)]+_ch[15&_ew(d,8)]+_ch[15&_ew(d,12)]+_ch[15&_ew(d,16)]+_ch[15&_ew(d,20)]+_ch[15&_ew(d,24)]+_ch[15&_ew(d,28)]},_ax._ci=function(a){var b=_ax._cj(a);return null!=b?b:_ax._cj(a^_ca)},_ax._cj=function(d){for(var b=4294967295,a=0,c=0;c<_cb.length;c++){var g=_cb[c],f=g[0];if(f==d)return new _ax(g[1]);var e=this._gj(d,f);e<b&&(a=g[1],b=e)}return b<=3?new _ax(a):null},_cg.forBits=function(a){if(a<0||a>=FOR_BITS.Length)throw"bad arguments";return FOR_BITS[a]};var L=new _cg(0,1,"L"),M=new _cg(1,0,"M"),Q=new _cg(2,3,"Q"),H=new _cg(3,2,"H"),FOR_BITS=new Array(M,L,H,Q);_dl._gn=function(c,h,s){if(c.length!=h._dp)throw"bad arguments";for(var k=h._bu(s),e=0,d=k._fb(),r=0;r<d.length;r++)e+=d[r].Count;for(var l=new Array(e),n=0,o=0;o<d.length;o++)for(var f=d[o],r=0;r<f.Count;r++){var m=f._dm,t=k._bo+m;l[n++]=new _dl(m,new Array(t))}for(var u=l[0]._dw.length,b=l.length-1;b>=0;){var w=l[b]._dw.length;if(w==u)break;b--}b++;for(var g=u-k._bo,a=0,r=0;r<g;r++)for(var o=0;o<n;o++)l[o]._dw[r]=c[a++];for(var o=b;o<n;o++)l[o]._dw[g]=c[a++];for(var q=l[0]._dw.length,r=g;r<q;r++)for(var o=0;o<n;o++){var v=o<b?r:r+1;l[o]._dw[v]=c[a++]}return l},_dx={},_dx._gl=function(a){if(a<0||a>7)throw"bad arguments";return _dx._dy[a]},_dx._dy=new Array(new _fg,new _fh,new _fi,new _fj,new _fk,new _fl,new _fm,new _fn),_az._bb=new _az(285),_az._bc=new _az(301),_az._bd=function(d,c){return d^c},Decoder={},Decoder.rsDecoder=new _db(_az._bb),Decoder.correctErrors=function(g,b){for(var d=g.length,f=new Array(d),e=0;e<d;e++)f[e]=255&g[e];var a=g.length-b;try{Decoder.rsDecoder.decode(f,a)}catch(c){throw c}for(var e=0;e<b;e++)g[e]=f[e]},Decoder.decode=function(r){for(var b=new _cl(r),o=b._cq(),c=b._cm()._cg,q=b._gk(),a=_dl._gn(q,o,c),f=0,k=0;k<a.Length;k++)f+=a[k]._du;for(var e=new Array(f),n=0,h=0;h<a.length;h++){var m=a[h],d=m.Codewords,g=m._du;Decoder.correctErrors(d,g);for(var k=0;k<g;k++)e[n++]=d[k]}var l=new QRCodeDataBlockReader(e,o._fd,c.Bits);return l},qrcode={},qrcode.imagedata=null,qrcode.width=0,qrcode.height=0,qrcode.qrCodeSymbol=null,qrcode.debug=!1,qrcode._eo=[[10,9,8,8],[12,11,16,10],[14,13,16,12]],qrcode.callback=null,qrcode.decode=function(d){if(0==arguments.length){var b=document.getElementById("qr-canvas"),a=b.getContext("2d");return qrcode.width=b.width,qrcode.height=b.height,qrcode.imagedata=a.getImageData(0,0,qrcode.width,qrcode.height),qrcode.result=qrcode.process(a),null!=qrcode.callback&&qrcode.callback(qrcode.result),qrcode.result}var c=new Image;c.onload=function(){var i=document.createElement("canvas"),h=i.getContext("2d"),f=document.getElementById("out-canvas");if(null!=f){var g=f.getContext("2d");g.clearRect(0,0,320,240),g.drawImage(c,0,0,320,240)}i.width=c.width,i.height=c.height,h.drawImage(c,0,0),qrcode.width=c.width,qrcode.height=c.height;try{qrcode.imagedata=h.getImageData(0,0,c.width,c.height)}catch(j){return qrcode.result="Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!",void(null!=qrcode.callback&&qrcode.callback(qrcode.result))}try{qrcode.result=qrcode.process(h)}catch(j){console.log(j),qrcode.result="error decoding QR Code"}null!=qrcode.callback&&qrcode.callback(qrcode.result)},c.src=d},qrcode.decode_utf8=function(a){return decodeURIComponent(escape(a))},qrcode.process=function(r){var c=((new Date).getTime(),qrcode.grayScaleToBitmap(qrcode.grayscale()));if(qrcode.debug){for(var m=0;m<qrcode.height;m++)for(var n=0;n<qrcode.width;n++){var o=4*n+m*qrcode.width*4;qrcode.imagedata.data[o]=(c[n+m*qrcode.width],0),qrcode.imagedata.data[o+1]=(c[n+m*qrcode.width],0),qrcode.imagedata.data[o+2]=c[n+m*qrcode.width]?255:0}r.putImageData(qrcode.imagedata,0,0)}var h=new Detector(c),q=h.detect();qrcode.debug&&r.putImageData(qrcode.imagedata,0,0);for(var k=Decoder.decode(q.bits),g=k.DataByte,l="",f=0;f<g.length;f++)for(var e=0;e<g[f].length;e++)l+=String.fromCharCode(g[f][e]);(new Date).getTime();return qrcode.decode_utf8(l)},qrcode.getPixel=function(a,b){if(qrcode.width<a)throw"point error";if(qrcode.height<b)throw"point error";return point=4*a+b*qrcode.width*4,p=(33*qrcode.imagedata.data[point]+34*qrcode.imagedata.data[point+1]+33*qrcode.imagedata.data[point+2])/100,p},qrcode.binarize=function(d){for(var c=new Array(qrcode.width*qrcode.height),e=0;e<qrcode.height;e++)for(var b=0;b<qrcode.width;b++){var a=qrcode.getPixel(b,e);c[b+e*qrcode.width]=a<=d}return c},qrcode._em=function(d){for(var c=4,k=Math.floor(qrcode.width/c),j=Math.floor(qrcode.height/c),f=new Array(c),g=0;g<c;g++){f[g]=new Array(c);for(var e=0;e<c;e++)f[g][e]=new Array(0,0)}for(var o=0;o<c;o++)for(var a=0;a<c;a++){f[a][o][0]=255;for(var l=0;l<j;l++)for(var n=0;n<k;n++){var h=d[k*a+n+(j*o+l)*qrcode.width];h<f[a][o][0]&&(f[a][o][0]=h),h>f[a][o][1]&&(f[a][o][1]=h)}}for(var m=new Array(c),b=0;b<c;b++)m[b]=new Array(c);for(var o=0;o<c;o++)for(var a=0;a<c;a++)m[a][o]=Math.floor((f[a][o][0]+f[a][o][1])/2);return m},qrcode.grayScaleToBitmap=function(f){for(var j=qrcode._em(f),b=j.length,e=Math.floor(qrcode.width/b),d=Math.floor(qrcode.height/b),c=new Array(qrcode.height*qrcode.width),i=0;i<b;i++)for(var a=0;a<b;a++)for(var g=0;g<d;g++)for(var h=0;h<e;h++)c[e*a+h+(d*i+g)*qrcode.width]=f[e*a+h+(d*i+g)*qrcode.width]<j[a][i];return c},qrcode.grayscale=function(){for(var c=new Array(qrcode.width*qrcode.height),d=0;d<qrcode.height;d++)for(var b=0;b<qrcode.width;b++){var a=qrcode.getPixel(b,d);c[b+d*qrcode.width]=a}return c},Array.prototype.remove=function(c,b){var a=this.slice((b||c)+1||this.length);return this.length=c<0?this.length+c:c,this.push.apply(this,a)};var _gf=3,_eh=57,_el=8,_eg=2;qrcode._er=function(c){function b(l,k){return xDiff=l.X-k.X,yDiff=l.Y-k.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)}function d(k,o,n){var m=o.x,l=o.y;return(n.x-m)*(k.y-l)-(n.y-l)*(k.x-m)}var a,j,h,i=b(c[0],c[1]),f=b(c[1],c[2]),e=b(c[0],c[2]);if(f>=i&&f>=e?(j=c[0],a=c[1],h=c[2]):e>=f&&e>=i?(j=c[1],a=c[0],h=c[2]):(j=c[2],a=c[0],h=c[1]),d(a,j,h)<0){var g=a;a=h,h=g}c[0]=a,c[1]=j,c[2]=h},function(root,factory){"function"==typeof define&&define.amd?define([],factory):"object"==typeof exports?module.exports=factory():root.download=factory()}(this,function(){return function download(data,strFileName,strMimeType){function dataUrlToBlob(strUrl){var parts=strUrl.split(/[:;,]/),type=parts[1],decoder="base64"==parts[2]?atob:decodeURIComponent,binData=decoder(parts.pop()),mx=binData.length,i=0,uiArr=new Uint8Array(mx);for(i;i<mx;++i)uiArr[i]=binData.charCodeAt(i);return new myBlob([uiArr],{type:type})}function saver(url,winMode){if("download"in anchor)return anchor.href=url,anchor.setAttribute("download",fileName),anchor.className="download-js-link",anchor.innerHTML="downloading...",anchor.style.display="none",jQuery(".detailsView").append(anchor),setTimeout(function(){anchor.click(),jQuery(".download-js-link").remove(),winMode===!0&&setTimeout(function(){self.URL.revokeObjectURL(anchor.href)},250)},66),!0;if(/(Version)\/(\d+)\.(\d+)(?:\.(\d+))?.*Safari\//.test(navigator.userAgent))return url=url.replace(/^data:([\w\/\-\+]+)/,defaultMime),window.open(url)||confirm("Displaying New Document\n\nUse Save As... to download, then click back to return to this page.")&&(location.href=url),!0;var f=document.createElement("iframe");document.body.appendChild(f),winMode||(url="data:"+url.replace(/^data:([\w\/\-\+]+)/,defaultMime)),f.src=url,setTimeout(function(){document.body.removeChild(f)},333)}var blob,reader,self=window,defaultMime="application/octet-stream",mimeType=strMimeType||defaultMime,payload=data,url=!strFileName&&!strMimeType&&payload,anchor=document.createElement("a"),toString=function(a){return String(a)},myBlob=self.Blob||self.MozBlob||self.WebKitBlob||toString,fileName=strFileName||"download";if(myBlob=myBlob.call?myBlob.bind(self):Blob,"true"===String(this)&&(payload=[payload,mimeType],mimeType=payload[0],payload=payload[1]),url&&url.length<2048&&(fileName=url.split("/").pop().split("?")[0],anchor.href=url,anchor.href.indexOf(url)!==-1)){var ajax=new XMLHttpRequest;return ajax.open("GET",url,!0),ajax.responseType="blob",ajax.onload=function(e){download(e.target.response,fileName,defaultMime)},setTimeout(function(){ajax.send()},0),ajax}if(/^data\:[\w+\-]+\/[\w+\-]+[,;]/.test(payload)){if(!(payload.length>2096103.424&&myBlob!==toString))return navigator.msSaveBlob?navigator.msSaveBlob(dataUrlToBlob(payload),fileName):saver(payload);payload=dataUrlToBlob(payload),mimeType=payload.type||defaultMime}if(blob=payload instanceof myBlob?payload:new myBlob([payload],{type:mimeType}),navigator.msSaveBlob)return navigator.msSaveBlob(blob,fileName);if(self.URL)saver(self.URL.createObjectURL(blob),!0);else{if("string"==typeof blob||blob.constructor===toString)try{return saver("data:"+mimeType+";base64,"+self.btoa(blob))}catch(y){return saver("data:"+mimeType+","+encodeURIComponent(blob))}reader=new FileReader,reader.onload=function(e){saver(this.result)},reader.readAsDataURL(blob)}return!0}}),angular.module("ui.sortable",[]).value("uiSortableConfig",{items:"> [ng-repeat],> [data-ng-repeat],> [x-ng-repeat]"}).directive("uiSortable",["uiSortableConfig","$timeout","$log",function(uiSortableConfig,$timeout,$log){return{require:"?ngModel",scope:{ngModel:"=",uiSortable:"="},link:function(scope,element,attrs,ngModel){function combineCallbacks(first,second){var firstIsFunc="function"==typeof first,secondIsFunc="function"==typeof second;return firstIsFunc&&secondIsFunc?function(){first.apply(this,arguments),second.apply(this,arguments)}:secondIsFunc?second:first}function getSortableWidgetInstance(element){var data=element.data("ui-sortable");return data&&"object"==typeof data&&"ui-sortable"===data.widgetFullName?data:null}function patchSortableOption(key,value){return callbacks[key]?("stop"===key&&(value=combineCallbacks(value,function(){scope.$apply()}),value=combineCallbacks(value,afterStop)),value=combineCallbacks(callbacks[key],value)):wrappers[key]&&(value=wrappers[key](value)),value||"items"!==key&&"ui-model-items"!==key||(value=uiSortableConfig.items),value}function patchUISortableOptions(newVal,oldVal,sortableWidgetInstance){function addDummyOptionKey(value,key){key in opts||(opts[key]=null)}angular.forEach(callbacks,addDummyOptionKey);var optsDiff=null;if(oldVal){var defaultOptions;angular.forEach(oldVal,function(oldValue,key){if(!(newVal&&key in newVal)){if(key in directiveOpts)return void("ui-floating"===key?opts[key]="auto":opts[key]=patchSortableOption(key,void 0));defaultOptions||(defaultOptions=angular.element.ui.sortable().options);var defaultValue=defaultOptions[key];defaultValue=patchSortableOption(key,defaultValue),optsDiff||(optsDiff={}),optsDiff[key]=defaultValue,opts[key]=defaultValue}})}return angular.forEach(newVal,function(value,key){return key in directiveOpts?("ui-floating"!==key||value!==!1&&value!==!0||!sortableWidgetInstance||(sortableWidgetInstance.floating=value),void(opts[key]=patchSortableOption(key,value))):(value=patchSortableOption(key,value),optsDiff||(optsDiff={}),optsDiff[key]=value,void(opts[key]=value))}),optsDiff}function getPlaceholderElement(element){var placeholder=element.sortable("option","placeholder");if(placeholder&&placeholder.element&&"function"==typeof placeholder.element){var result=placeholder.element();return result=angular.element(result)}return null}function getPlaceholderExcludesludes(element,placeholder){var notCssSelector=opts["ui-model-items"].replace(/[^,]*>/g,""),excludes=element.find('[class="'+placeholder.attr("class")+'"]:not('+notCssSelector+")");return excludes}function hasSortingHelper(element,ui){var helperOption=element.sortable("option","helper");return"clone"===helperOption||"function"==typeof helperOption&&ui.item.sortable.isCustomHelperUsed()}function getSortingHelper(element,ui,savedNodes){var result=null;return hasSortingHelper(element,ui)&&"parent"===element.sortable("option","appendTo")&&(result=savedNodes.last()),result}function isFloating(item){return/left|right/.test(item.css("float"))||/inline|table-cell/.test(item.css("display"))}function getElementScope(elementScopes,element){for(var result=null,i=0;i<elementScopes.length;i++){var x=elementScopes[i];if(x.element[0]===element[0]){result=x.scope;break}}return result}function afterStop(e,ui){ui.item.sortable._destroy()}function getItemIndex(item){return item.parent().find(opts["ui-model-items"]).index(item)}function wireUp(){scope.$watchCollection("ngModel",function(){$timeout(function(){getSortableWidgetInstance(element)&&element.sortable("refresh")},0,!1)}),callbacks.start=function(e,ui){if("auto"===opts["ui-floating"]){var siblings=ui.item.siblings(),sortableWidgetInstance=getSortableWidgetInstance(angular.element(e.target));sortableWidgetInstance.floating=isFloating(siblings)}var index=getItemIndex(ui.item);ui.item.sortable={model:ngModel.$modelValue[index],index:index,source:ui.item.parent(),sourceModel:ngModel.$modelValue,cancel:function(){ui.item.sortable._isCanceled=!0},isCanceled:function(){return ui.item.sortable._isCanceled},isCustomHelperUsed:function(){return!!ui.item.sortable._isCustomHelperUsed},_isCanceled:!1,_isCustomHelperUsed:ui.item.sortable._isCustomHelperUsed,_destroy:function(){angular.forEach(ui.item.sortable,function(value,key){ui.item.sortable[key]=void 0})}}},callbacks.activate=function(e,ui){savedNodes=element.contents();var placeholder=getPlaceholderElement(element);if(placeholder&&placeholder.length){var excludes=getPlaceholderExcludesludes(element,placeholder);savedNodes=savedNodes.not(excludes)}var connectedSortables=ui.item.sortable._connectedSortables||[];connectedSortables.push({element:element,scope:scope}),ui.item.sortable._connectedSortables=connectedSortables},callbacks.update=function(e,ui){if(!ui.item.sortable.received){ui.item.sortable.dropindex=getItemIndex(ui.item);var droptarget=ui.item.parent();ui.item.sortable.droptarget=droptarget;var droptargetScope=getElementScope(ui.item.sortable._connectedSortables,droptarget);ui.item.sortable.droptargetModel=droptargetScope.ngModel,element.sortable("cancel")}var sortingHelper=!ui.item.sortable.received&&getSortingHelper(element,ui,savedNodes);sortingHelper&&sortingHelper.length&&(savedNodes=savedNodes.not(sortingHelper)),savedNodes.appendTo(element),ui.item.sortable.received&&(savedNodes=null),ui.item.sortable.received&&!ui.item.sortable.isCanceled()&&scope.$apply(function(){ngModel.$modelValue.splice(ui.item.sortable.dropindex,0,ui.item.sortable.moved)})},callbacks.stop=function(e,ui){if(!ui.item.sortable.received&&"dropindex"in ui.item.sortable&&!ui.item.sortable.isCanceled())scope.$apply(function(){ngModel.$modelValue.splice(ui.item.sortable.dropindex,0,ngModel.$modelValue.splice(ui.item.sortable.index,1)[0])});else if((!("dropindex"in ui.item.sortable)||ui.item.sortable.isCanceled())&&!angular.equals(element.contents(),savedNodes)){var sortingHelper=getSortingHelper(element,ui,savedNodes);sortingHelper&&sortingHelper.length&&(savedNodes=savedNodes.not(sortingHelper)),savedNodes.appendTo(element)}savedNodes=null},callbacks.receive=function(e,ui){ui.item.sortable.received=!0},callbacks.remove=function(e,ui){"dropindex"in ui.item.sortable||(element.sortable("cancel"),ui.item.sortable.cancel()),ui.item.sortable.isCanceled()||scope.$apply(function(){ui.item.sortable.moved=ngModel.$modelValue.splice(ui.item.sortable.index,1)[0]})},wrappers.helper=function(inner){return inner&&"function"==typeof inner?function(e,item){var oldItemSortable=item.sortable,index=getItemIndex(item);item.sortable={model:ngModel.$modelValue[index],index:index,source:item.parent(),sourceModel:ngModel.$modelValue,_restore:function(){angular.forEach(item.sortable,function(value,key){item.sortable[key]=void 0}),item.sortable=oldItemSortable}};var innerResult=inner.apply(this,arguments);return item.sortable._restore(),item.sortable._isCustomHelperUsed=item!==innerResult,innerResult}:inner},scope.$watchCollection("uiSortable",function(newVal,oldVal){var sortableWidgetInstance=getSortableWidgetInstance(element);if(sortableWidgetInstance){var optsDiff=patchUISortableOptions(newVal,oldVal,sortableWidgetInstance);optsDiff&&element.sortable("option",optsDiff)}},!0),patchUISortableOptions(opts)}function init(){ngModel?wireUp():$log.info("ui.sortable: ngModel not provided!",element),element.sortable(opts)}function initIfEnabled(){return(!scope.uiSortable||!scope.uiSortable.disabled)&&(init(),initIfEnabled.cancelWatcher(),initIfEnabled.cancelWatcher=angular.noop,!0)}var savedNodes,opts={},directiveOpts={"ui-floating":void 0,"ui-model-items":uiSortableConfig.items},callbacks={receive:null,remove:null,start:null,stop:null,update:null},wrappers={helper:null};return angular.extend(opts,directiveOpts,uiSortableConfig,scope.uiSortable),angular.element.fn&&angular.element.fn.jquery?(initIfEnabled.cancelWatcher=angular.noop,void(initIfEnabled()||(initIfEnabled.cancelWatcher=scope.$watch("uiSortable.disabled",initIfEnabled)))):void $log.error("ui.sortable: jQuery should be included before AngularJS!")}}}]);var CRYPTO={paranoia_level:null,PASSWORD:{generate:function(length,callback,progress,start_string){return sjcl.random.isReady(paranoia_level)?(null==start_string&&(start_string=""),start_string.length<length?(start_string+=CRYPTO.RANDOM.getRandomASCII(),null!=progress&&progress(start_string.length/length*100),void setTimeout(this.generate(length,callback,progress,start_string),100)):(callback(start_string),void(null!=progress&&progress(100)))):void setTimeout(this.generate(length,callback,progress,start_string),500)},logRepeatedCharCount:function(str){var chars=[];for(i=0;i<str.length;i++)chars[str.charAt(i)]=null==chars[str.charAt(i)]?0:chars[str.charAt(i)]+1;return chars}},RANDOM:{getRandomASCII:function(){for(var ret="";ret.length<4;){var int=sjcl.random.randomWords(1,paranoia_level);int=int[0];var tmp=this._isASCII((4278190080&int)>>24);tmp&&(ret+=tmp),tmp=this._isASCII((16711680&int)>>16),tmp&&(ret+=tmp),tmp=this._isASCII((65280&int)>>8),tmp&&(ret+=tmp),tmp=this._isASCII(255&int),tmp&&(ret+=tmp)}return ret},_isASCII:function(data){return data>31&&data<127&&String.fromCharCode(data)}},initEngines:function(default_paranoia){paranoia_level=default_paranoia||10,sjcl.random.setDefaultParanoia(this.paranoia_level),sjcl.random.startCollectors(),console.warn("Crypto stuff initialized")}};CRYPTO.initEngines(),function(){angular.module("passmanApp",["ngAnimate","ngCookies","ngResource","ngRoute","ngSanitize","ngTouch","templates-main","LocalStorageModule","offClick","ngPasswordMeter","ngclipboard","xeditable","ngTagsInput","angularjs-datetime-picker","ui.sortable","pascalprecht.translate"]).config(function($routeProvider){$routeProvider.when("/",{templateUrl:"views/vaults.html",controller:"VaultCtrl"}).when("/vault/:vault_id",{templateUrl:"views/show_vault.html",controller:"CredentialCtrl"}).when("/vault/:vault_id/new",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/edit/:credential_id",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/:credential_id/share",{templateUrl:"views/share_credential.html",controller:"ShareCtrl"}).when("/vault/:vault_id/:credential_id/revisions",{templateUrl:"views/credential_revisions.html",controller:"RevisionCtrl"}).when("/vault/:vault_id/settings",{templateUrl:"views/settings.html",controller:"SettingsCtrl"}).otherwise({redirectTo:"/"})}).config(["$httpProvider",function($httpProvider){$httpProvider.defaults.headers.common.requesttoken=oc_requesttoken}]).config(function(localStorageServiceProvider){localStorageServiceProvider.setNotify(!0,!0)}).config(function($translateProvider){$translateProvider.useSanitizeValueStrategy("sanitizeParameters"),$translateProvider.useUrlLoader(OC.generateUrl("/apps/passman/api/v2/language")),$translateProvider.preferredLanguage("en")}),jQuery(document).ready(function(){var findItemByID=function(id){var credentials,foundItem=!1;return credentials=angular.element("#app-content-wrapper").scope().credentials,angular.forEach(credentials,function(credential){credential.credential_id===id&&(foundItem=credential)}),foundItem};jQuery(document).on("click",".undoDelete",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().recoverCredential(credential),angular.element("#app-content-wrapper").scope().$apply()}),jQuery(document).on("click",".undoRestore",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().deleteCredential(credential),angular.element("#app-content-wrapper").scope().$apply()})})}(),function(){angular.module("passmanApp").filter("as",function($parse){return function(value,context,path){return $parse(path).assign(context,value)}})}(),function(){angular.module("passmanApp").filter("bytes",function(){return function(bytes,precision){if(isNaN(parseFloat(bytes))||!isFinite(bytes))return"-";"undefined"==typeof precision&&(precision=1);var units=["bytes","kB","MB","GB","TB","PB"],number=Math.floor(Math.log(bytes)/Math.log(1024));return(bytes/Math.pow(1024,Math.floor(number))).toFixed(precision)+" "+units[number]}})}(),function(){angular.module("passmanApp").filter("credentialSearch",function(){return function(credentials,filter){var _credentials=[];if(credentials){if(!filter)return credentials;if(""===filter.filterText.trim())return credentials;for(var matchedWithFilter=function(c){for(var f=0;f<filter.fields.length;f++){var field=filter.fields[f],fieldValue="string"==typeof c[field]?c[field]:JSON.stringify(c[field]);if(filter.hasOwnProperty("useRegex")&&filter.useRegex===!0)try{var patt=new RegExp(filter.filterText);if(patt.test(fieldValue))return!0}catch(e){}if(fieldValue.toLowerCase().indexOf(filter.filterText.toLowerCase())>=0)return!0}return!1},ci=0;ci<credentials.length;ci++){var c=credentials[ci];matchedWithFilter(c)&&_credentials.push(c)}return _credentials}return[]}})}(),function(){angular.module("passmanApp").filter("propsFilter",function(){return function(items,props){var out=[];if(angular.isArray(items)){var keys=Object.keys(props);items.forEach(function(item){for(var itemMatches=!1,i=0;i<keys.length;i++){var prop=keys[i],text=props[prop].toLowerCase();if(item[prop].toString().toLowerCase().indexOf(text)!==-1){itemMatches=!0;break}}itemMatches&&out.push(item)})}else out=items;return out}})}(),function(){angular.module("passmanApp").filter("range",function(){return function(val,range){range=parseInt(range);for(var i=0;i<range;i++)val.push(i);return val}})}(),function(){angular.module("passmanApp").filter("tagFilter",function(){return function(credentials,tags){var _credentials=[];if(tags.length>0)for(var ci=0;ci<credentials.length;ci++){for(var c=credentials[ci],matches=0,ct=0;ct<c.tags_raw.length;ct++){var t=c.tags_raw[ct];tags.indexOf(t.text)!==-1&&matches++}matches===tags.length&&_credentials.push(c)}return 0===tags.length&&(_credentials=credentials),_credentials}})}(),function(){angular.module("passmanApp").service("CacheService",["localStorageService","EncryptService",function(localStorageService,EncryptService){return{get:function(name){return EncryptService.decryptString(localStorageService.get(name))},set:function(key,value){value=EncryptService.encryptString(value),localStorageService.set(key,value)}}}])}(),function(){angular.module("passmanApp").service("CredentialService",["$http","EncryptService","VaultService","FileService",function($http,EncryptService,VaultService,FileService){var credential={credential_id:null,guid:null,vault_id:null,label:null,description:null,created:null,changed:null,tags:[],email:null,username:null,password:null,url:null,favicon:null,renew_interval:null,expire_time:0,delete_time:0,files:[],custom_fields:[],otp:{},hidden:!1},_encryptedFields=["description","username","password","files","custom_fields","otp","email","tags","url"];return{newCredential:function(){return angular.copy(credential)},createCredential:function(credential){for(var _credential=angular.copy(credential),i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue))}_credential.expire_time=new Date(angular.copy(credential.expire_time)).getTime()/1e3;var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials");return $http.post(queryUrl,_credential).then(function(response){return response.data?response.data:response})},getEncryptedFields:function(){return _encryptedFields},updateCredential:function(credential,skipEncyption){var _credential=angular.copy(credential);if(!skipEncyption)for(var i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue))}_credential.expire_time=new Date(angular.copy(credential.expire_time)).getTime()/1e3;var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+credential.guid);return $http.patch(queryUrl,_credential).then(function(response){return response.data?response.data:response})},getCredential:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid);return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},destroyCredential:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},encryptCredential:function(credential,key){for(var i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),key)}return credential},decryptCredential:function(credential,key){for(var i=0;i<_encryptedFields.length;i++){var field_decrypted_value,field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);try{field_decrypted_value=EncryptService.decryptString(fieldValue,key)}catch(e){throw e}try{credential[field]=JSON.parse(field_decrypted_value)}catch(e){console.warn("Field"+field+" in "+credential.label+" could not be parsed! Value:"+fieldValue)}}return credential},getRevisions:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid+"/revision");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},updateRevision:function(revision){var _revision=angular.copy(revision);_revision.credential_data=window.btoa(JSON.stringify(_revision.credential_data));var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+revision.credential_data.guid+"/revision/"+revision.revision_id);return $http.patch(queryUrl,_revision).then(function(response){return response.data?response.data:response})},deleteRevision:function(credential_guid,revision_id){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+credential_guid+"/revision/"+revision_id);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},reencryptCredential:function(credential_guid,old_password,new_password){var service=this,progress_datatype=function(current,total,process){this.process=process,this.current=current,this.total=total,this.calculated=current/total*100},promise_credential_update=function(){service.getCredential(credential_guid).then(function(credential){this.parent.plain_credential=service.decryptCredential(credential,this.parent.old_password);var tmp=angular.copy(this.parent.plain_credential);this.parent.new_credential_cryptogram=service.encryptCredential(tmp,this.parent.new_password),this.call_progress(new progress_datatype(1,2,"credential")),this.parent.new_credential_cryptogram.skip_revision=!0,service.updateCredential(this.parent.new_credential_cryptogram,!0).then(function(){this.call_progress(new progress_datatype(2,2,"credential")),this.call_then({plain_text:this.parent.plain_credential,cryptogram:this.parent.new_credential_cryptogram})}.bind(this))}.bind(this))},promise_files_update=function(){this.total=2*this.parent.plain_credential.files.length,this.current=0;for(var i=0;i<this.parent.plain_credential.files.length;i++){var _file=this.parent.plain_credential.files[i];FileService.getFile(_file).then(function(fileData){fileData.filename=EncryptService.decryptString(fileData.filename,this.parent.old_password),fileData.file_data=EncryptService.decryptString(fileData.file_data,this.parent.old_password),this.current++,this.call_progress(new progress_datatype(this.current,this.total,"files")),FileService.updateFile(fileData,this.parent.new_password).then(function(){this.current++,this.call_progress(new progress_datatype(this.current,this.total,"files")),this.current===this.total&&this.call_then("All files has been updated")}.bind(this))}.bind(this))}0===this.parent.plain_credential.files.length&&(this.call_progress(new progress_datatype(0,0,"files")),this.call_then("No files to update"))},promise_revisions_update=function(){service.getRevisions(this.parent.plain_credential.guid).then(function(revisions){this.total=2*revisions.length,this.upload=0,this.current=0,this.revisions=revisions;var revision_workload=function(){if(0===this.revisions.length)return this.call_progress(new progress_datatype(0,0,"revisions")),void this.call_then("No history to update");var _revision=revisions[this.current];_revision.credential_data=service.decryptCredential(_revision.credential_data,this.parent.old_password),_revision.credential_data=service.encryptCredential(_revision.credential_data,this.parent.new_password),this.current++,this.call_progress(new progress_datatype(this.current+this.upload,this.total,"revisions")),service.updateRevision(_revision).then(function(){this.upload++,this.call_progress(new progress_datatype(this.upload+this.current,this.total,"revisions")),this.current+this.upload===this.total&&this.call_then("History updated")}.bind(this)),this.current!==this.total/2&&setTimeout(revision_workload.bind(this),1)};setTimeout(revision_workload.bind(this),1)}.bind(this))},promise_workload=function(){this.old_password=angular.copy(old_password),this.new_password=angular.copy(new_password),this.promises=0;var master_promise=this,password_data=function(){this.old_password=master_promise.old_password,this.new_password=master_promise.new_password,this.plain_credential=master_promise.plain_credential};this.credential_data={},new C_Promise(promise_credential_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(data){console.warn("End credential update"),master_promise.plain_credential=data.plain_text,master_promise.promises++,master_promise.credential_data=data,new C_Promise(promise_files_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(){console.warn("End files update"),master_promise.promises--,0===master_promise.promises&&master_promise.call_then(master_promise.credential_data)}),master_promise.promises++,new C_Promise(promise_revisions_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(){console.warn("End revisions update"),master_promise.promises--,0===master_promise.promises&&master_promise.call_then(master_promise.credential_data)})})};return new C_Promise(promise_workload)}}}])}(),function(){angular.module("passmanApp").service("EncryptService",["VaultService",function(VaultService){var encryption_config={adata:"",iter:1e3,ks:256,mode:"ccm",ts:64};return{encryptString:function(string,_key){_key||(_key=VaultService.getActiveVault().vaultKey);var rp={},ct=sjcl.encrypt(_key,string,encryption_config,rp);return window.btoa(ct)},decryptString:function(ciphertext,_key){_key||(_key=VaultService.getActiveVault().vaultKey),ciphertext=window.atob(ciphertext);var rp={};try{return sjcl.decrypt(_key,ciphertext,encryption_config,rp)}catch(e){throw e}}}}])}(),function(){angular.module("passmanApp").service("FileService",["$http","EncryptService",function($http,EncryptService){
-return{uploadFile:function(file,key){var queryUrl=OC.generateUrl("apps/passman/api/v2/file"),_file=angular.copy(file);_file.filename=EncryptService.encryptString(_file.filename,key);var data=EncryptService.encryptString(angular.copy(file.data),key);return _file.data=data,$http.post(queryUrl,_file).then(function(response){return response.data?response.data:response})},deleteFile:function(file){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);return $http.delete(queryUrl,_file).then(function(response){return response.data?response.data:response})},getFile:function(file){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);return $http.get(queryUrl,_file).then(function(response){return response.data?"[object Array]"===Object.prototype.toString.call(response.data)?response.data.pop():response.data:response})},updateFile:function(file,key){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);_file.filename=EncryptService.encryptString(_file.filename,key);var data=EncryptService.encryptString(angular.copy(file.file_data),key);return _file.file_data=data,$http.patch(queryUrl,_file).then(function(response){return response.data?response.data:response})},dataURItoBlob:function(dataURI,ftype){var byteString,ab,ia,bb,i;for(byteString=atob(dataURI.split(",")[1]),ab=new ArrayBuffer(byteString.length),ia=new Uint8Array(ab),i=0;i<byteString.length;i++)ia[i]=byteString.charCodeAt(i);return bb=new Blob([ab],{type:ftype}),URL.createObjectURL(bb)}}}])}(),function(){angular.module("passmanApp").service("NotificationService",["$timeout",function($timeout){var to;return{showNotification:function(text,time,closeCallback){var notification=OC.Notification.showHtml(text);return to=$timeout(function(){OC.Notification.hide(notification,closeCallback)},time),notification},hideNotification:function(notification){$timeout.cancel(to),OC.Notification.hide(notification)},hideAll:function(){OC.Notification.hide()}}}])}(),function(){angular.module("passmanApp").service("SettingsService",["localStorageService","$http","$rootScope",function(localStorageService,$http,$rootScope){var settings={defaultVault:null,defaultVaultPass:null};$http.get(OC.generateUrl("apps/passman/api/v2/settings")).then(function(response){response.data&&(settings=angular.merge(settings,response.data),$rootScope.$broadcast("settings_loaded"))});var cookie=localStorageService.get("settings");return settings=angular.merge(settings,cookie),{getSettings:function(){return settings},getSetting:function(name){return settings[name]},setSetting:function(name,value){settings[name]=value,localStorageService.set("settings",settings)}}}])}(),function(){angular.module("passmanApp").service("ShareService",["$http","VaultService","EncryptService","CredentialService",function($http,VaultService,EncryptService,CredentialService){var paranoia_level=10;return sjcl.random.setDefaultParanoia(paranoia_level),sjcl.random.startCollectors(),{search:function(string){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/search");return $http.post(queryUrl,{search:string}).then(function(response){return response.data?response.data:response})},shareWithUser:function(credential,target_user_data){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/share");return $http.post(queryUrl,{item_id:credential.credential_id,item_guid:credential.guid,permissions:target_user_data.accessLevel,vaults:target_user_data.vaults})},getVaultsByUser:function(userId){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/vaults/"+userId);return $http.get(queryUrl,{search:userId}).then(function(response){if(response.data){for(var i=0;i<response.data.length;i++)response.data[i].public_sharing_key=forge.pki.publicKeyFromPem(response.data[i].public_sharing_key);return response.data}return response})},getPendingRequests:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/pending");return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},saveSharingRequest:function(request,crypted_shared_key){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/save");return $http.post(queryUrl,{item_guid:request.item_guid,target_vault_guid:request.target_vault_guid,final_shared_key:crypted_shared_key}).then(function(response){return response.data})},declineSharingRequest:function(request){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/decline/"+request.req_id);return $http.delete(queryUrl).then(function(response){return response.data})},unshareCredential:function(credential){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid);return $http.delete(queryUrl).then(function(response){return response.data})},unshareCredentialFromUser:function(credential,user_id){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/"+user_id);return $http.delete(queryUrl).then(function(response){return response.data})},createPublicSharedCredential:function(shareObj){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/public");return $http.post(queryUrl,shareObj).then(function(response){return response.data})},getPublicSharedCredential:function(credential_guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential_guid+"/public");return $http.get(queryUrl).then(function(response){return response.data?response:response},function(result){return result})},getSharedCredentialACL:function(credential){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/acl");return $http.get(queryUrl).then(function(response){return response.data?response.data:response},function(result){return result})},updateCredentialAcl:function(credential,acl){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/acl");return $http.patch(queryUrl,acl).then(function(response){return response.data})},getCredendialsSharedWithUs:function(vault_guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/vault/"+vault_guid+"/get");return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},downloadSharedFile:function(credential,file){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/file/"+file.guid);return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},encryptSharedCredential:function(credential,sharedKey){var _credential=angular.copy(credential);_credential.shared_key=EncryptService.encryptString(sharedKey);for(var encrypted_fields=CredentialService.getEncryptedFields(),i=0;i<encrypted_fields.length;i++){var field=encrypted_fields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),sharedKey)}return _credential},decryptSharedCredential:function(credential,sharedKey){for(var _credential=angular.copy(credential),encrypted_fields=CredentialService.getEncryptedFields(),i=0;i<encrypted_fields.length;i++){var field_decrypted_value,field=encrypted_fields[i],fieldValue=angular.copy(_credential[field]);if(_credential.hasOwnProperty(field)){try{field_decrypted_value=EncryptService.decryptString(fieldValue,sharedKey)}catch(e){throw e}try{_credential[field]=JSON.parse(field_decrypted_value)}catch(e){throw console.warn("Field"+field+" in "+_credential.label+" could not be parsed! Value:"+fieldValue),e}}}return _credential},generateRSAKeys:function(key_length){var p=new C_Promise(function(){var state=forge.pki.rsa.createKeyPairGenerationState(key_length,65537),step=function(){forge.pki.rsa.stepKeyPairGenerationState(state,100)?this.call_then(state.keys):(null!==state.p?this.call_progress(50):this.call_progress(0),setTimeout(step.bind(this),1))};setTimeout(step.bind(this),100)});return p},generateSharedKey:function(size){return size=size||20,new C_Promise(function(){var t=this;CRYPTO.PASSWORD.generate(size,function(pass){t.call_then(pass)},function(progress){t.call_progress(progress)})})},rsaKeyPairToPEM:function(keypair){return{publicKey:forge.pki.publicKeyToPem(keypair.publicKey),privateKey:forge.pki.privateKeyToPem(keypair.privateKey)}},getSharingKeys:function(){var vault=VaultService.getActiveVault();return{private_sharing_key:EncryptService.decryptString(angular.copy(vault.private_sharing_key)),public_sharing_key:vault.public_sharing_key}},rsaPrivateKeyFromPEM:function(private_pem){return forge.pki.privateKeyFromPem(private_pem)},rsaPublicKeyFromPEM:function(public_pem){return forge.pki.publicKeyFromPem(public_pem)},cypherRSAStringWithPublicKeyBulkAsync:function(vaults,string){var workload=function(){if(this.current_index<this.vaults.length>0&&this.vaults.length>0){var _vault=angular.copy(this.vaults[this.current_index]);_vault.key=forge.util.encode64(_vault.public_sharing_key.encrypt(this.string)),this.data.push(_vault),this.current_index++,this.call_progress(this.current_index),setTimeout(workload.bind(this),1)}else this.call_then(this.data)};return new C_Promise(function(){this.data=[],this.vaults=vaults,this.string=string,this.current_index=0,setTimeout(workload.bind(this),0)})}}}])}(),function(){angular.module("passmanApp").service("TagService",["$filter",function($filter){var _tags=[];return{getTags:function(){return _tags},searchTag:function(string){return $filter("filter")(_tags,{text:string})},addTags:function(tags){for(var i=0;i<tags.length;i++)tags[i].text&&0===$filter("filter")(_tags,{text:tags[i].text}).length&&_tags.push(tags[i])}}}])}(),function(){angular.module("passmanApp").service("VaultService",["$http",function($http){var _activeVault,_this=this,service={getVaults:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},setActiveVault:function(vault){_activeVault=angular.copy(vault)},getActiveVault:function(){return _activeVault},getVaultSetting:function(key,default_value){return _activeVault.vault_settings&&void 0!==_activeVault.vault_settings[key]?_activeVault.vault_settings[key]:default_value},setVaultSetting:function(key,value){return!!_activeVault.vault_settings&&(_activeVault.vault_settings[key]=value,void _this.updateVault(_activeVault))},createVault:function(vaultName){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults");return $http.post(queryUrl,{vault_name:vaultName}).then(function(response){return response.data?response.data:response})},getVault:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.guid);return $http.get(queryUrl).then(function(response){return response.data?(response.data.vault_settings?response.data.vault_settings=JSON.parse(window.atob(response.data.vault_settings)):response.data.vault_settings={},response.data):response})},updateVault:function(vault){var _vault=angular.copy(vault);delete _vault.defaultVaultPass,delete _vault.defaultVault,delete _vault.vaultKey,_vault.vault_settings=window.btoa(JSON.stringify(_vault.vault_settings));var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+_vault.guid);return $http.patch(queryUrl,_vault).then(function(response){return response.data?response.data:response})},updateSharingKeys:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.guid+"/sharing-keys");return $http.post(queryUrl,vault).then(function(response){return response.data?response.data:response})},deleteVault:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.vault_id);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})}};return service}])}(),function(){angular.module("passmanApp").factory("SharingACL",function(){function ACL(acl_permission){this.permission=acl_permission}return ACL.prototype.permissions={READ:1,WRITE:2,FILES:4,HISTORY:8,OWNER:128},ACL.prototype.hasPermission=function(permission){return permission===(this.permission&permission)},ACL.prototype.addPermission=function(permission){this.permission=this.permission|permission},ACL.prototype.removePermission=function(permission){this.permission=this.permission&~permission},ACL.prototype.togglePermission=function(permission){this.permission^=permission},ACL.prototype.getAccessLevel=function(){return this.permission},ACL})}(),function(){angular.module("passmanApp").directive("autoScroll",function(){return{restrict:"A",scope:{autoScroll:"="},link:function(scope){scope.$watch("autoScroll",function(){$("#import_log").scrollTop($("#import_log")[0].scrollHeight)},!0)}}})}(),function(){angular.module("passmanApp").directive("clearBtn",["$parse",function($parse){return{link:function(scope,elm,attr){elm.wrap("<div style='position: relative'></div>");var btn="<span id="+Math.round(1e9*Math.random())+' class="searchclear ng-hide fa fa-times-circle-o"></span>',angularBtn=angular.element(btn);elm.after(angularBtn),angularBtn.on("click",function(){elm.val("").trigger("change"),$parse(attr.ngModel).assign(scope,""),scope.$apply()}),elm.bind("focus keyup change paste propertychange",function(){elm.val()&&elm.val().length>0?angularBtn.removeClass("ng-hide"):angularBtn.addClass("ng-hide")})}}}])}(),function(){angular.module("passmanApp").directive("selectOnClick",["$window",function($window){return{restrict:"A",link:function(scope,element){element.on("click",function(){$window.getSelection().toString()||this.setSelectionRange(0,this.value.length)})}}}])}(),function(){angular.module("passmanApp").directive("colorFromString",[function(){return{restrict:"A",scope:{string:"=colorFromString"},link:function(scope,el){function genColor(str){for(var hash=0,i=0;i<str.length;i++)hash=str.charCodeAt(i)+((hash<<5)-hash);var c=(16777215&hash).toString(16).toUpperCase();return"#"+"00000".substring(0,6-c.length)+c}scope.$watch("string",function(){jQuery(el).css("border-color",genColor(scope.string))})}}}])}(),function(){angular.module("passmanApp").directive("credentialField",["$timeout","$translate",function($timeout,$translate){return{scope:{value:"=value",secret:"=secret"},restrict:"A",replace:"true",template:'<span class="credential_field"><div class="value" ng-class="{\'ellipsis\': isLink}"><span ng-repeat="n in [] | range:value.length" ng-if="!valueVisible">*</span><span ng-if="valueVisible" ng-bind-html="value"></span></div><div class="tools"><div class="cell" ng-if="toggle" tooltip="tggltxt" ng-click="toggleVisibility()"><i class="fa" ng-class="{\'fa-eye\': !valueVisible, \'fa-eye-slash\': valueVisible }"></i></div><div class="cell" ng-if="isLink"><a ng-href="{{value}}" target="_blank" rel="nofollow noopener noreferrer"><i tooltip="\'Open in new window\'" class="link fa fa-external-link"></i></a></div><div class="cell" ngclipboard-success="onSuccess(e);" ngclipboard-error="onError(e);" ngclipboard data-clipboard-text="{{value}}"><i tooltip="copy_msg" class="fa fa-clipboard"></i></div></div></span>',link:function(scope){var expression=/(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/gi,regex=new RegExp(expression);$translate(["toggle.visibility","copy","copied"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["copy.field"]}),scope.$watch("value",function(){scope.value&&(scope.secret&&(scope.valueVisible=!1),regex.test(scope.value)&&(scope.isLink=!0))}),scope.toggle||scope.secret&&(scope.toggle=!0);var timer;scope.onSuccess=function(){scope.copy_msg=$translate.instant("copied"),$timeout.cancel(timer),timer=$timeout(function(){scope.copy_msg=$translate.instant("copy")},5e3)},scope.valueVisible=!0,scope.toggleVisibility=function(){scope.valueVisible=!scope.valueVisible}}}}])}(),function(){angular.module("passmanApp").directive("fileSelect",["$window",function($window){return{restrict:"A",scope:{success:"&success",error:"&error",progress:"&progress"},link:function(scope,el){scope.success=scope.success(),scope.error=scope.error(),scope.progress=scope.progress();var _currentFile,fileReader=new $window.FileReader;fileReader.onload=function(){_currentFile.data=fileReader.result,scope.success(_currentFile)},fileReader.onprogress=function(event){var percent=event.loaded/event.total*100;scope.$apply(scope.progress({file_total:event.total,file_loaded:event.loaded,file_percent:percent}))},fileReader.onerror=function(){scope.error()},el.bind("change",function(e){var i,_queueTotalFileSize=0;for(i=0;i<e.target.files.length;i++)_queueTotalFileSize+=e.target.files[i].size;for(i=0;i<e.target.files.length;i++){_currentFile=e.target.files[i];var mb_limit=5;_currentFile.size>1024*mb_limit*1024&&scope.error("TO_BIG",_currentFile),fileReader.readAsDataURL(_currentFile)}})}}}])}(),function(){angular.module("passmanApp").directive("ngEnter",function(){return function(scope,element,attrs){element.bind("keydown keypress",function(event){13===event.which&&(scope.$apply(function(){scope.$eval(attrs.ngEnter)}),event.preventDefault())})}})}(),function(){angular.module("passmanApp").directive("otpGenerator",["$compile","$timeout",function($compile,$timeout){function dec2hex(s){return(s<15.5?"0":"")+Math.round(s).toString(16)}function hex2dec(s){return parseInt(s,16)}function base32tohex(base32){if(base32){var i,base32chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bits="",hex="";for(i=0;i<base32.length;i++){var val=base32chars.indexOf(base32.charAt(i).toUpperCase());bits+=leftpad(val.toString(2),5,"0")}for(i=0;i+4<=bits.length;i+=4){var chunk=bits.substr(i,4);hex+=parseInt(chunk,2).toString(16)}return hex}}function leftpad(str,len,pad){return len+1>=str.length&&(str=Array(len+1-str.length).join(pad)+str),str}return{restrict:"A",template:'<span class="otp_generator"><span credential-field value="otp" secret="\'true\'"></span> <span ng-bind="timeleft"></span></span>',transclude:!1,scope:{secret:"="},replace:!0,link:function(scope){scope.otp=null,scope.timeleft=null,scope.timer=null;var updateOtp=function(){if(scope.secret){var key=base32tohex(scope.secret),epoch=Math.round((new Date).getTime()/1e3),time=leftpad(dec2hex(Math.floor(epoch/30)),16,"0"),hmacObj=new jsSHA(time,"HEX"),hmac=hmacObj.getHMAC(key,"HEX","SHA-1","HEX"),offset=hex2dec(hmac.substring(hmac.length-1)),otp=(hex2dec(hmac.substr(2*offset,8))&hex2dec("7fffffff"))+"";otp=otp.substr(otp.length-6,6),scope.otp=otp}},timer=function(){var epoch=Math.round((new Date).getTime()/1e3),countDown=30-epoch%30;epoch%30===0&&updateOtp(),scope.timeleft=countDown,scope.timer=$timeout(timer,1e3)};scope.$watch("secret",function(n){n?($timeout.cancel(scope.timer),updateOtp(),timer()):$timeout.cancel(scope.timer)},!0),scope.$on("$destroy",function(){$timeout.cancel(scope.timer)})}}}])}(),function(){angular.module("passmanApp").directive("passwordGen",function($timeout,$translate){function Arcfour(){this.j=this.i=0,this.S=[]}function ARC4init(r){var t,n,e;for(t=0;256>t;++t)this.S[t]=t;for(t=n=0;256>t;++t)n=n+this.S[t]+r[t%r.length]&255,e=this.S[t],this.S[t]=this.S[n],this.S[n]=e;this.j=this.i=0}function ARC4next(){var r;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,r=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=r,this.S[r+this.S[this.i]&255]}function prng_newstate(){return new Arcfour}function generatePassword(r,t,n,e,o,i,p,g){var _,a,s,f,d,h,u,l,c,v,w,y,m;if(void 0===r&&(r=8+get_random(0,1)),r>256&&(r=256,document.getElementById("length").value=256),i>256&&(i=256),void 0===t&&(t=!0),void 0===n&&(n=!0),void 0===e&&(e=!0),void 0===o&&(o=!1),void 0===i&&(i=0),void 0===p&&(p=!1),void 0===g&&(g=!0),_=0,a=0,s=0,g&&(_=a=s=1),f=[],n&&_>0)for(d=0;_>d;d++)f[f.length]="L";if(t&&a>0)for(d=0;a>d;d++)f[f.length]="U";if(e&&i>0)for(d=0;i>d;d++)f[f.length]="D";if(o&&s>0)for(d=0;s>d;d++)f[f.length]="S";for(;f.length<r;)f[f.length]="A";for(f.sort(function(){return 2*get_random(0,1)-1}),h="",u="abcdefghjkmnpqrstuvwxyz",p||(u+="ilo"),n&&(h+=u),l="ABCDEFGHJKMNPQRSTUVWXYZ",p||(l+="ILO"),t&&(h+=l),c="23456789",p||(c+="10"),e&&(h+=c),v="!@#$%^&*",o&&(h+=v),w="",y=0;r>y;y++){switch(f[y]){case"L":m=u;break;case"U":m=l;break;case"D":m=c;break;case"S":m=v;break;case"A":m=h}d=get_random(0,m.length-1),w+=m.charAt(d)}return w}function rng_seed_int(r){rng_pool[rng_pptr++]^=255&r,rng_pool[rng_pptr++]^=r>>8&255,rng_pool[rng_pptr++]^=r>>16&255,rng_pool[rng_pptr++]^=r>>24&255,rng_pptr>=rng_psize&&(rng_pptr-=rng_psize)}function rng_seed_time(){rng_seed_int((new Date).getTime())}function rng_get_byte(){if(null==rng_state){for(rng_seed_time(),rng_state=prng_newstate(),rng_state.init(rng_pool),rng_pptr=0;rng_pptr<rng_pool.length;++rng_pptr)rng_pool[rng_pptr]=0;rng_pptr=0}return rng_state.next()}function rng_get_bytes(r){var t;for(t=0;t<r.length;++t)r[t]=rng_get_byte()}function SecureRandom(){}function get_random(r,t){var n,e,o,i=t-r+1;for(rng_seed_time(),n=[],e=0;4>e;e++)n[e]=0;for(rng_get_bytes(n),o=0,e=0;4>e;e++)o*=256,o+=n[e];return o%=i,o+=r}var rng_psize,rng_state,rng_pool,rng_pptr,t,z,crypt_obj,num,buf,i;if(Arcfour.prototype.init=ARC4init,Arcfour.prototype.next=ARC4next,rng_psize=256,null==rng_pool){if(rng_pool=[],rng_pptr=0,"undefined"!=typeof navigator&&"Netscape"==navigator.appName&&navigator.appVersion<"5"&&"undefined"!=typeof window&&window.crypto)for(z=window.crypto.random(32),t=0;t<z.length;++t)rng_pool[rng_pptr++]=255&z.charCodeAt(t);try{if(crypt_obj=null,"undefined"!=typeof window&&void 0!==window.crypto?crypt_obj=window.crypto:"undefined"!=typeof window&&void 0!==window.msCrypto&&(crypt_obj=window.msCrypto),void 0!==crypt_obj&&"function"==typeof crypt_obj.getRandomValues&&rng_psize>rng_pptr)for(num=Math.floor((rng_psize-rng_pptr)/2)+1,buf=new Uint16Array(num),crypt_obj.getRandomValues(buf),i=0;i<buf.length;i++)t=buf[i],rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t}catch(e){}for(;rng_psize>rng_pptr;)t=Math.floor(65536*Math.random()),rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t;rng_pptr=0,rng_seed_time()}return SecureRandom.prototype.nextBytes=rng_get_bytes,{scope:{model:"=ngModel",length:"@",placeholder:"@",settings:"=settings",callback:"&callback"},restrict:"E",replace:"true",template:'<div class=" pw-gen "><div class="input-group "><input ng-show="!passwordVisible" type="password" ng-disabled="disabled" class="form-control " ng-model="password" placeholder="{{placeholder}}"><input ng-show="passwordVisible" type="text" ng-disabled="disabled" class="form-control " ng-model="password" placeholder="{{placeholder}}"><span class="generate_pw"><div class="cell" tooltip="gen_msg" ng-click="generatePasswordStart()"><i class="fa fa-refresh"></i></div><div class="cell" tooltip="tggltxt" ng-click="toggleVisibility()"><i class="fa" ng-class="{\'fa-eye\': passwordVisible, \'fa-eye-slash\': !passwordVisible }"></i></div><div class="cell" tooltip="\'Copy password to clipboard\'"><i class="fa fa-clipboard" ngclipboard-success="onSuccess(e);" ngclipboard-error="onError(e);" ngclipboard data-clipboard-text="{{password}}"></i></div></button></div></div>',link:function(scope){scope.callback=scope.callback(),scope.$watch("model",function(){scope.password=scope.model}),scope.passwordVisible=!1,scope.toggleVisibility=function(){scope.passwordVisible=!scope.passwordVisible},scope.passwordNotNull=!1,scope.$watch("settings",function(){scope.settings&&!scope.password&&scope.settings.generateOnCreate&&scope.generatePasswordStart()}),$translate(["password.gen","password.copy","copied","toggle.visibility"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["password.copy"],scope.gen_msg=translations["password.gen"]}),scope.$watch("password",function(){scope.model=scope.password,scope.password_repeat=scope.model}),scope.onSuccess=function(e){OC.Notification.showTemporary($translate.instant("password.copied")),e.clearSelection()},scope.onError=function(){OC.Notification.showTemporary("Press Ctrl+C to copy!")},scope.progressDivShow=!1,scope.generatePasswordStart=function(){scope.progressDivShow=!0,scope.progressValue=0,scope.progressWidth={width:scope.progressValue+"%"},scope.generatePasswordProgress()},scope.generatePasswordProgress=function(){$timeout(function(){scope.progressValue<100?(scope.password=scope._generatePassword(scope.settings),scope.progressValue+=10,scope.progressWidth={width:scope.progressValue+"%"},scope.disabled=!0,scope.generatePasswordProgress()):(scope.disabled=!1,scope.callback&&scope.callback(scope.password))},10)},scope._generatePassword=function(settings){var _settings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0};settings=angular.merge(_settings,settings);var password=generatePassword(settings.length,settings.useUppercase,settings.useLowercase,settings.useDigits,settings.useSpecialChars,settings.minimumDigitCount,settings.avoidAmbiguousCharacters,settings.requireEveryCharType);return password}}}})}(),function(){angular.module("passmanApp").directive("progressBar",["$translate",function($translate){return{restrict:"A",template:'<div class="progress"><div class="progress-bar" role="progressbar" aria-valuenow="{{progress}}"aria-valuemin="0" aria-valuemax="100" style="width:{{progress}}%;" use-theme><span class="sr-only">{{progress}}% {{completed_text}}</span><span ng-if="index && total" class="progress-label" use-theme type="\'color\'" color="\'true\'">{{index}} / {{total}}</span><span ng-if="!index && !total" class="progress-label" use-theme type="\'color\'" color="\'true\'">{{progress}}%</span></div></div>',scope:{progress:"=progressBar",index:"=index",total:"=total"},link:function(scope){$translate(["complete"]).then(function(translations){scope.completed_text=translations.complete})}}}])}(),function(){angular.module("passmanApp").directive("qrread",["$parse",function($parse){return{scope:!0,link:function(scope,element,attributes){var invoker=$parse(attributes.onRead);scope.imageData=null,qrcode.callback=function(result){invoker(scope,{qrdata:{qrData:result,image:scope.imageData}})},element.bind("change",function(changeEvent){var reader=new FileReader,file=changeEvent.target.files[0];reader.readAsDataURL(file),reader.onload=function(){return function(e){scope.imageData=e.target.result,qrcode.decode(e.target.result)}}(file)})}}}])}(),function(){angular.module("passmanApp").directive("tooltip",[function(){return{restrict:"A",scope:{tooltip:"=tooltip"},link:function(scope,el){scope.$watch("tooltip",function(){scope.tooltip&&(jQuery(el).attr("title",scope.tooltip),jQuery(el).tooltip(),jQuery(el).attr("title",scope.tooltip).tooltip("fixTitle"),jQuery(".tooltip-inner").text(scope.tooltip),jQuery(el).is(":visible"))})}}}])}(),function(){angular.module("passmanApp").directive("useTheme",[function(){function invertColor(hexTripletColor){var color=hexTripletColor;return color=color.substring(1),color=parseInt(color,16),color^=16777215,color=color.toString(16),color=("000000"+color).slice(-6),color="#"+color}return{restrict:"A",scope:{type:"=type",color:"=",negative:"="},link:function(scope,el){var _color=jQuery("#header").css("background-color"),_bg=_color;scope.negative&&(_bg=invertColor(_bg)),scope.type?jQuery(el).css(scope.type,_bg):jQuery(el).css("background-color",_bg),scope.color&&jQuery(el).css("color",invertColor(_color))}}}])}();var PassmanImporter={};!function(window,$,PassmanImporter){PassmanImporter.parseRow_=function(row){row=row.trim();var isQuoted=!1;return'"'===row.charAt(0)&&(row=row.substring(1),isQuoted=!0),'"'===row.charAt(row.length-2)&&(row=row.substring(0,row.length-2),isQuoted=!0),row=isQuoted===!0?row.split('","'):row.split(",")},PassmanImporter.htmlDecode=function(input){var e=document.createElement("div");return e.innerHTML=input,e.childNodes[0].nodeValue},PassmanImporter.toObject_=function(headings,row){for(var result={},i=0,ii=row.length;i<ii;i++)headings[i]?(headings[i]=headings[i].replace(",","_").toLowerCase().replace(" ","_").replace("(","").replace(")","").replace('"',""),result[headings[i]]=row[i]):result[ii]=row[i];return result},PassmanImporter.join_=function(arr,sep){for(var parts=[],i=0,ii=arr.length;i<ii;i++)arr[i]&&parts.push(arr[i]);return parts.join(sep)},PassmanImporter.newCredential=function(){var credential={credential_id:null,guid:null,vault_id:null,label:null,description:null,created:null,changed:null,tags:[],email:null,username:null,password:null,url:null,favicon:null,renew_interval:null,expire_time:0,delete_time:0,files:[],custom_fields:[],otp:{},hidden:!1};return credential},PassmanImporter.readCsv=function(csv,hasHeadings){hasHeadings=void 0===hasHeadings||hasHeadings;var lines=[];return Papa.parse(csv,{complete:function(results){if(results.data)for(var headings=hasHeadings?results.data[0]:null,start=hasHeadings?1:0,i=start;i<results.data.length;i++){var _row=hasHeadings?PassmanImporter.toObject_(headings,results.data[i]):results.data[i];lines.push(_row)}}}),lines},PassmanImporter.readJson=function(string){return JSON.parse(string)}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.clippers={info:{name:"Clipperz.is",id:"clippers",description:"Go to menu -> Export -> Download HTML + JSON. Fields will be imported as custom fields."}},PassmanImporter.clippers.readFile=function(file_data){return new C_Promise(function(){var credential_list=[],re=/<textarea>(.*?)<\/textarea>/gi,matches=re.exec(file_data);if(matches){var raw_json=matches[0].substring(10);raw_json=PassmanImporter.htmlDecode(raw_json.slice(0,-11));for(var json_objects=PassmanImporter.readJson(raw_json),i=0;i<json_objects.length;i++){var card=json_objects[i];re=/(\w+)/gi;var tags=card.label.match(re);card.label=card.label.replace(tags.join(" "),"").trim(),tags=tags.map(function(item){return{text:item.replace("","")}});var _credential=PassmanImporter.newCredential();_credential.label=card.label,_credential.description=card.data.notes,_credential.tags=tags;for(var field in card.currentVersion.fields){var field_data=card.currentVersion.fields[field];_credential.custom_fields.push({label:field_data.label,value:field_data.value,secret:field_data.hidden===!0})}_credential.label&&credential_list.push(_credential);var progress={percent:i/json_objects.length*100,loaded:i,total:json_objects.length};this.call_progress(progress)}}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.dashLaneCsv={info:{name:"Dashlane 4 csv",id:"dashLaneCsv",description:"Create an csv export. Go to File -> export -> Unsecured archive (readable) in CSV format"}},PassmanImporter.dashLaneCsv.readFile=function(file_data){return new C_Promise(function(){for(var rows=file_data.split("\n"),credential_list=[],i=0;i<rows.length;i++){var row=rows[i],row_data=row.split('","');'"'===row_data[0].charAt(0)&&(row_data[0]=row_data[0].substring(1)),'"'===row_data[row_data.length-1].toString().charAt(row_data[row_data.length-1].length-1)&&(row_data[row_data.length-1]=row_data[row_data.length-1].substring(0,row_data[row_data.length-1].length-1));var _credential=PassmanImporter.newCredential();_credential.label=row_data[0],_credential.username=row_data[2],_credential.password=row_data[row_data.length-2],_credential.url=row_data[0],_credential.description=row_data[row_data.length-1],_credential.label&&credential_list.push(_credential);var progress={percent:i/rows.length*100,loaded:i,total:rows.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.keepassCsv={info:{name:"KeePass csv",id:"keepassCsv",description:"Create an csv export with the following options enabled: http://i.imgur.com/CaeTA4d.png"}},PassmanImporter.keepassCsv.readFile=function(file_data){var p=new C_Promise(function(){
-for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row.account,_credential.username=row.login_name,_credential.password=row.password,_credential.url=row.web_site,row.hasOwnProperty("expires")&&(row.expires=row.expires.replace('"',""),_credential.expire_time=new Date(row.expires).getTime()/1e3);var tags=row.group?[{text:row.group}]:[];if(row.hasOwnProperty("group_tree"))for(var exploded_tree=row.group_tree.split("\\\\"),t=0;t<exploded_tree.length;t++)exploded_tree[t].trim().length>0&&tags.push({text:exploded_tree[t].trim()});_credential.tags=tags,credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)});return p}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.lastpassCsv={info:{name:"LastPass csv",id:"lastpassCsv",description:"Create an csv export. Go to More options -> Advanced -> Export -> Last Pass CSV File"}},PassmanImporter.lastpassCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=PassmanImporter.htmlDecode(row.name),_credential.username=row.username,_credential.password=row.password,_credential.url=row.url,_credential.tags=row.grouping?[{text:row.grouping}]:[],_credential.description=row.extra,_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.passmanJson={info:{name:"Passman JSON",id:"passmanJson",description:"Export the item in passman as passman json, with all fields enabled"}},PassmanImporter.passmanJson.readFile=function(file_data){return new C_Promise(function(){for(var parsed_json=PassmanImporter.readJson(file_data),credential_list=[],i=0;i<parsed_json.length;i++){var item=parsed_json[i],_credential=PassmanImporter.newCredential();if(_credential.label=item.label,_credential.username=item.account,_credential.password=item.password,_credential.email=item.email,_credential.url=item.url,_credential.tags=item.tags,_credential.description=item.description,item.hasOwnProperty("customFields")&&item.customFields.length>0)for(var cf=0;cf<item.customFields.length;cf++)_credential.custom_fields.push({label:item.customFields[cf].label,value:item.customFields[cf].value,secret:"1"===item.customFields[cf].clicktoshow});item.hasOwnProperty("otpsecret")&&item.otpsecret&&(_credential.otp={issuer:item.otpsecret.issuer,label:item.otpsecret.label,qr_uri:{image:item.otpsecret.qrCode,qrData:""},secret:item.otpsecret.secret,type:item.otpsecret.type}),_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_json.length*100,loaded:i,total:parsed_json.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.passpackCsv={info:{name:"Passpack csv",id:"passpackCsv",description:"Go to Tools -> Export. Select Comma Separated Values, All entries then continue."}},PassmanImporter.passpackCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data,!1),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row[0],_credential.username=row[1],_credential.password=row[2],_credential.url=row[3];var tags=row[4].split(" ");tags.length>0&&(_credential.tags=tags.map(function(item){if(item)return{text:item}}).filter(function(item){return item})),_credential.description=row[5],_credential.email=row[6],_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.randomData={info:{name:"Random data",id:"randomData",description:"Create's 50 random credentials for testing purposes."}},PassmanImporter.randomData.readFile=function(){return new C_Promise(function(){var label,tags=["Social media","Hosting","Forums","Webshops","FTP","SSH","Banking","Applications","Server stuff","mysql","Wifi","Games","Certificate","Serials"],credential_list=[],_this=this,generateCredential=function(max,i,callback){if(jQuery){var url=OC.generateUrl("apps/passman/api/internal/generate_person");$.ajax({url:url,dataType:"json",success:function(data){if(data){var _credential=PassmanImporter.newCredential();label=Math.random()>=.5?data.domain:data.email_d+" - "+data.email_u,_credential.label=label,_credential.username=data.username,_credential.password=data.password,_credential.url=data.url;for(var tag_amount=Math.floor(5*Math.random()),ta=0,_tags=[];ta<tag_amount;){var item=tags[Math.floor(Math.random()*tags.length)];_tags.indexOf(item)===-1&&(_tags.push(item),ta++)}if(_credential.tags=_tags.map(function(item){if(item)return{text:item}}).filter(function(item){return item}),credential_list.push(_credential),i<max){var progress={percent:i/max*100,loaded:i,total:max};_this.call_progress(progress),generateCredential(max,i+1,callback)}else callback(credential_list)}else generateCredential(max,i,callback)}})}};generateCredential(50,1,function(credential_list){_this.call_then(credential_list)})})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};if(function(window,$,PassmanImporter){PassmanImporter.zohoCsv={info:{name:"ZOHO csv",id:"zohoCsv",description:'Create an csv export. Go to Tools -> Export secrets -> Select "General CSV" and click "Export Secrets"'}},PassmanImporter.zohoCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();if(_credential.label=row.secret_name,_credential.url=row.secret_url,_credential.description=row.notes,row.hasOwnProperty("secretdata"))for(var rows=row.secretdata.split("\n"),r=0;r<rows.length;r++){var cells=rows[r].split(":"),key=cells[0],value=cells.slice(1).join(":");key&&value&&_credential.custom_fields.push({label:key,value:value,secret:!1})}""!==_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter),!window.PassmanExporter)var PassmanExporter={};PassmanExporter.csv={info:{name:"CSV",id:"csv",description:"Export credentials as csv."}},PassmanExporter.csv.export=function(credentials){return new C_Promise(function(){for(var _this=this,headers=["label","username","password","email","description","tags"],file_data='"'+headers.join('","')+'"\n',i=0;i<credentials.length;i++){for(var _credential=credentials[i],row_data=[],h=0;h<headers.length;h++){var field=headers[h];if("tags"===field){for(var _tags=[],t=0;t<_credential[field].length;t++)_tags.push(_credential[field][t].text);var data="["+_tags.join(",")+"]";row_data.push('"'+data+'"')}else row_data.push('"'+_credential[field]+'"')}var progress={percent:i/credentials.length*100,loaded:i,total:credentials.length};_this.call_progress(progress),file_data+=row_data.join(",")+"\n"}_this.call_then(),download(file_data,"passman-export.csv")})},function(){angular.module("passmanApp").controller("BookmarkletCtrl",["$scope","$rootScope","$location","VaultService","CredentialService","SettingsService","NotificationService","EncryptService","TagService","FileService","ShareService","$translate",function($scope,$rootScope,$location,VaultService,CredentialService,SettingsService,NotificationService,EncryptService,TagService,FileService,ShareService,$translate){if($scope.active_vault=!1,$scope.http_warning_hidden=!0,"http"===$location.$$protocol&&($scope.using_http=!0),$scope.logout=function(){$scope.active_vault=!1},SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));VaultService.getVault(_vault).then(function(vault){vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(vault),$scope.active_vault=vault,$scope.pwSettings=VaultService.getVaultSetting("pwSettings",{length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})})}VaultService.getVaults().then(function(vaults){$scope.vaults=vaults}),$scope.default_vault=!1,$scope.remember_vault_password=!1,$scope.list_selected_vault=!1,$scope.toggleDefaultVault=function(){$scope.default_vault=!$scope.default_vault,$scope.default_vault===!0?SettingsService.setSetting("defaultVault",$scope.list_selected_vault):SettingsService.setSetting("defaultVault",null)},$scope.toggleRememberPassword=function(){$scope.remember_vault_password=!$scope.remember_vault_password,$scope.remember_vault_password&&(SettingsService.setSetting("defaultVault",$scope.list_selected_vault),$scope.default_vault=!0),$scope.remember_vault_password!==!0&&SettingsService.setSetting("defaultVault",null)},$scope.clearState=function(){$scope.list_selected_vault=!1,$scope.creating_vault=!1,$scope.error=!1},$scope.selectVault=function(vault){$scope.list_selected_vault=vault},$scope.sharing_keys={},$scope.newVault=function(){$scope.creating_vault=!0;var key_size=1024;ShareService.generateRSAKeys(key_size).progress(function(progress){var p=progress>0?2:1,msg=$translate.instant("generating.sharing.keys");msg=msg.replace("%step",p),$scope.creating_keys=msg,$scope.$digest()}).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.sharing_keys.private_sharing_key=pem.privateKey,$scope.sharing_keys.public_sharing_key=pem.publicKey,$scope.$digest()})};var _loginToVault=function(vault,vault_key){var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),delete _vault.credentials,$scope.active_vault=_vault};$scope.vaultDecryptionKey="",$scope.loginToVault=function(vault,vault_key){$scope.error=!1;var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);try{EncryptService.decryptString(vault.challenge_password),$scope.remember_vault_password&&SettingsService.setSetting("defaultVaultPass",vault_key),_loginToVault(vault,vault_key)}catch(e){$scope.error=$translate.instant("invalid.vault.key")}},$scope.createVault=function(vault_name,vault_key,vault_key2){return vault_key!==vault_key2?void($scope.error=$translate.instant("password.do.not.match")):void VaultService.createVault(vault_name).then(function(vault){$scope.vaults.push(vault);var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);var test_credential=CredentialService.newCredential();test_credential.label="Test key for vault "+vault_name,test_credential.hidden=!0,test_credential.vault_id=vault.vault_id,test_credential.password="lorum ipsum",CredentialService.createCredential(test_credential).then(function(){_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),VaultService.updateSharingKeys(_vault).then(function(){_loginToVault(vault,vault_key)})})})},$scope.storedCredential=CredentialService.newCredential();var QueryString=function(){for(var query_string={},query=window.location.search.substring(1),vars=query.split("&"),i=0;i<vars.length;i++){var pair=vars[i].split("=");if("undefined"==typeof query_string[pair[0]])query_string[pair[0]]=decodeURIComponent(pair[1]);else if("string"==typeof query_string[pair[0]]){var arr=[query_string[pair[0]],decodeURIComponent(pair[1])];query_string[pair[0]]=arr}else query_string[pair[0]].push(decodeURIComponent(pair[1]))}return query_string}(),query_string=QueryString;$scope.storedCredential.label=query_string.title,$scope.storedCredential.url=query_string.url,$scope.setHttpWarning=function(state){$scope.http_warning_hidden=state},$translate(["general","password","custom.fields","files","otp"]).then(function(translations){$scope.tabs=[{title:translations.general,url:"views/partials/forms/edit_credential/basics.html",color:"blue"},{title:translations.password,url:"views/partials/forms/edit_credential/password.html",color:"green"},{title:translations["custom.fields"],url:"views/partials/forms/edit_credential/custom_fields.html",color:"orange"},{title:translations.files,url:"views/partials/forms/edit_credential/files.html",color:"yellow"},{title:translations.otp,url:"views/partials/forms/edit_credential/otp.html",color:"purple"}],$scope.currentTab=$scope.tabs[0]}),$scope.getTags=function($query){return TagService.searchTag($query)},$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},$scope.pwGenerated=function(pass){$scope.storedCredential.password_repeat=pass};var _customField={label:"",value:"",secret:!1,field_type:"text"};$scope.selected_field_type="text",$scope.new_custom_field=angular.copy(_customField),$scope.addCustomField=function(){var _field=angular.copy($scope.new_custom_field);if(_field.label||NotificationService.showNotification($translate.instant("error.no.label"),3e3),_field.value||NotificationService.showNotification($translate.instant("error.no.value"),3e3),_field.label&&_field.value)if($scope.selected_field_type="text",_field.secret=angular.copy("password"===$scope.selected_field_type),_field.field_type=angular.copy($scope.selected_field_type),"file"===_field.field_type){var _file=$scope.new_custom_field.value;FileService.uploadFile(_file).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename),_field.value=result,$scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)})}else $scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)},$scope.addFileToCustomField=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};$scope.new_custom_field.value=_file,$scope.$digest()},$scope.deleteCustomField=function(field){field.hasOwnProperty("field_type")&&"file"===field.field_type&&FileService.deleteFile(field.value);var idx=$scope.storedCredential.custom_fields.indexOf(field);$scope.storedCredential.custom_fields.splice(idx,1)},$scope.new_file={name:"",data:null},$scope.deleteFile=function(file){var idx=$scope.storedCredential.files.indexOf(file);FileService.deleteFile(file).then(function(){$scope.storedCredential.files.splice(idx,1)})},$scope.fileLoaded=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};FileService.uploadFile(_file).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename),$scope.storedCredential.files.push(result)}),$scope.$digest()},$scope.fileLoadError=function(error){return error},$scope.selected_file="",$scope.fileprogress=[],$scope.fileSelectProgress=function(progress){progress&&($scope.fileprogress=progress,$scope.$digest())},$scope.renewIntervalValue=0,$scope.renewIntervalModifier="0",$scope.updateInterval=function(renewIntervalValue,renewIntervalModifier){var value=parseInt(renewIntervalValue),modifier=parseInt(renewIntervalModifier);value&&modifier&&($scope.storedCredential.renew_interval=value*modifier)},$scope.parseQR=function(QRCode){var parsedQR,qrInfo,re=/otpauth:\/\/(totp|hotp)\/(.*)\?(secret|issuer)=(.*)&(issuer|secret)=(.*)/;qrInfo=[],parsedQR=QRCode.qrData.match(re),parsedQR&&(qrInfo={type:parsedQR[1],label:decodeURIComponent(parsedQR[2]),qr_uri:QRCode}),qrInfo[parsedQR[3]]=parsedQR[4],qrInfo[parsedQR[5]]=parsedQR[6],$scope.storedCredential.otp=qrInfo,$scope.$digest()},$scope.saveCredential=function(){delete $scope.storedCredential.password_repeat,$scope.storedCredential.credential_id||($scope.storedCredential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential($scope.storedCredential).then(function(){NotificationService.showNotification($translate.instant("credential.created"),5e3)}))}}])}(),function(){angular.module("passmanApp").controller("CredentialCtrl",["$scope","VaultService","SettingsService","$location","CredentialService","$rootScope","FileService","EncryptService","TagService","$timeout","NotificationService","CacheService","ShareService","SharingACL","$interval","$filter","$routeParams","$sce","$translate",function($scope,VaultService,SettingsService,$location,CredentialService,$rootScope,FileService,EncryptService,TagService,$timeout,NotificationService,CacheService,ShareService,SharingACL,$interval,$filter,$routeParams,$sce,$translate){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else $scope.active_vault||$location.path("/");$scope.show_spinner=!0;var fetchCredentials=function(){VaultService.getVault({guid:$routeParams.vault_id}).then(function(vault){var vaultKey=angular.copy($scope.active_vault.vaultKey),_credentials=angular.copy(vault.credentials);vault.credentials=[],$scope.active_vault=vault,$scope.active_vault.vaultKey=vaultKey,VaultService.setActiveVault($scope.active_vault);for(var i=0;i<_credentials.length;i++){var _credential=_credentials[i];try{if(_credential.shared_key){var enc_key=EncryptService.decryptString(_credential.shared_key);_credential=ShareService.decryptSharedCredential(angular.copy(_credential),enc_key)}else _credential=CredentialService.decryptCredential(angular.copy(_credential));_credential.tags_raw=_credential.tags}catch(e){NotificationService.showNotification($translate.instant("error.decrypt"),5e3)}_credential.tags&&TagService.addTags(_credential.tags),_credentials[i]=_credential}ShareService.getCredendialsSharedWithUs(vault.guid).then(function(shared_credentials){for(var c=0;c<shared_credentials.length;c++){var _shared_credential_data,_shared_credential=shared_credentials[c],decrypted_key=EncryptService.decryptString(_shared_credential.shared_key);try{_shared_credential_data=ShareService.decryptSharedCredential(_shared_credential.credential_data,decrypted_key)}catch(e){}_shared_credential_data&&(delete _shared_credential.credential_data,_shared_credential_data.acl=_shared_credential,_shared_credential_data.acl.permissions=new SharingACL(_shared_credential_data.acl.permissions),_shared_credential_data.tags_raw=_shared_credential_data.tags,_shared_credential_data.tags&&TagService.addTags(_shared_credential_data.tags),_credentials.push(_shared_credential_data))}angular.merge($scope.active_vault.credentials,_credentials),$scope.show_spinner=!1})})},getPendingShareRequests=function(){ShareService.getPendingRequests().then(function(shareRequests){shareRequests.length>0&&($scope.incoming_share_requests=shareRequests,jQuery(".share_popup").dialog({width:600,position:["center",90]}))})},refresh_data_interval=null;$scope.active_vault&&($scope.$parent.selectedVault=!0,fetchCredentials(),getPendingShareRequests(),refresh_data_interval=$interval(function(){fetchCredentials(),getPendingShareRequests()},3e5)),$scope.$on("$destroy",function(){$interval.cancel(refresh_data_interval)}),$scope.permissions=new SharingACL(0),$scope.hasPermission=function(acl,permission){if(acl){var tmp=new SharingACL(acl.permission);return tmp.hasPermission(permission)}return!0},$scope.acceptShareRequest=function(share_request){var crypted_shared_key=share_request.shared_key,private_key=EncryptService.decryptString(VaultService.getActiveVault().private_sharing_key);private_key=ShareService.rsaPrivateKeyFromPEM(private_key),crypted_shared_key=private_key.decrypt(forge.util.decode64(crypted_shared_key)),crypted_shared_key=EncryptService.encryptString(crypted_shared_key),ShareService.saveSharingRequest(share_request,crypted_shared_key).then(function(){var idx=$scope.incoming_share_requests.indexOf(share_request);$scope.incoming_share_requests.splice(idx,1);for(var active_share_requests=!1,v=0;v<$scope.incoming_share_requests.length;v++)$scope.incoming_share_requests[v].target_vault_id===$scope.active_vault.vault_id&&(active_share_requests=!0);active_share_requests===!1&&(jQuery(".ui-dialog").remove(),fetchCredentials())})},$scope.declineShareRequest=function(share_request){ShareService.declineSharingRequest(share_request).then(function(){var idx=$scope.incoming_share_requests.indexOf(share_request);$scope.incoming_share_requests.splice(idx,1);for(var active_share_requests=!1,v=0;v<$scope.incoming_share_requests.length;v++)$scope.incoming_share_requests[v].target_vault_id===$scope.active_vault.vault_id&&(active_share_requests=!0);active_share_requests===!1&&(jQuery(".ui-dialog").remove(),fetchCredentials())})};var settingsLoaded=function(){$scope.settings=SettingsService.getSettings()};SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.addCredential=function(){var new_credential=CredentialService.newCredential(),enc_c=CredentialService.encryptCredential(new_credential);SettingsService.setSetting("edit_credential",enc_c),$location.path("/vault/"+$scope.active_vault.guid+"/new")},$scope.editCredential=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("edit_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/edit/"+_credential.guid)},$scope.getRevisions=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("revision_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/"+_credential.guid+"/revisions")},$scope.shareCredential=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("share_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/"+_credential.guid+"/share")};var notification;$scope.deleteCredential=function(credential){var _credential=angular.copy(credential);try{_credential=CredentialService.decryptCredential(angular.copy(credential))}catch(e){}_credential.delete_time=(new Date).getTime()/1e3;for(var i=0;i<$scope.active_vault.credentials.length;i++)$scope.active_vault.credentials[i].credential_id===credential.credential_id&&($scope.active_vault.credentials[i].delete_time=_credential.delete_time);$scope.closeSelected(),notification&&NotificationService.hideNotification(notification),notification=NotificationService.showNotification($translate.instant("credential.deleted"),5e3,function(){CredentialService.updateCredential(_credential).then(function(result){result.delete_time>0&&(notification=!1)})})},$scope.recoverCredential=function(credential){var _credential=angular.copy(credential);try{_credential=CredentialService.decryptCredential(angular.copy(credential))}catch(e){}for(var i=0;i<$scope.active_vault.credentials.length;i++)$scope.active_vault.credentials[i].credential_id===credential.credential_id&&($scope.active_vault.credentials[i].delete_time=0);_credential.delete_time=0,$scope.closeSelected(),notification&&NotificationService.hideNotification(notification),NotificationService.showNotification($translate.instant("credential.recovered"),5e3,function(){CredentialService.updateCredential(_credential).then(function(){notification=!1})})},$scope.destroyCredential=function(credential){var _credential=angular.copy(credential);CredentialService.destroyCredential(_credential.guid).then(function(){for(var i=0;i<$scope.active_vault.credentials.length;i++)if($scope.active_vault.credentials[i].credential_id===credential.credential_id){$scope.active_vault.credentials.splice(i,1),NotificationService.showNotification($translate.instant("credential.destroyed"),5e3);break}})},$scope.view_mode="list",$scope.switchViewMode=function(viewMode){$scope.view_mode=viewMode},$scope.filterOptions={filterText:"",fields:["label","username","email","custom_fields"]},$scope.filtered_credentials=[],$scope.$watch("[selectedtags, filterOptions, delete_time, active_vault.credentials]",function(){if($scope.active_vault&&$scope.active_vault.credentials){var credentials=angular.copy($scope.active_vault.credentials),filtered_credentials=$filter("credentialSearch")(credentials,$scope.filterOptions);filtered_credentials=$filter("tagFilter")(filtered_credentials,$scope.selectedtags),filtered_credentials=$filter("filter")(filtered_credentials,{hidden:0}),$scope.filtered_credentials=filtered_credentials}},!0),$scope.selectedtags=[];var to;$rootScope.$on("selected_tags_updated",function(evt,_sTags){for(var _selectedTags=[],x=0;x<_sTags.length;x++)_selectedTags.push(_sTags[x].text);$scope.selectedtags=_selectedTags,$timeout.cancel(to),_selectedTags.length>0&&(to=$timeout(function(){if($scope.filtered_credentials){for(var _filtered_tags=[],i=0;i<$scope.filtered_credentials.length;i++)for(var tags=$scope.filtered_credentials[i].tags_raw,x=0;x<tags.length;x++){var tag=tags[x].text;_filtered_tags.indexOf(tag)===-1&&_filtered_tags.push(tag)}$rootScope.$emit("limit_tags_in_list",_filtered_tags)}},50))}),$scope.delete_time=0,$scope.showCredentialRow=function(credential){return 0===$scope.delete_time?0===credential.delete_time:credential.delete_time>$scope.delete_time},$rootScope.$on("set_delete_time",function(event,time){$scope.delete_time=time}),$scope.setDeleteTime=function(delete_time){$scope.delete_time=delete_time},$scope.selectedCredential=!1,$scope.selectCredential=function(credential){credential.description&&(credential.description_html=$sce.trustAsHtml(angular.copy(credential.description).replace("\n","<br />"))),$scope.selectedCredential=angular.copy(credential),$rootScope.$emit("app_menu",!0)},$scope.closeSelected=function(){$rootScope.$emit("app_menu",!1),$scope.selectedCredential=!1},$rootScope.$on("logout",function(){$scope.active_vault=null,$scope.credentials=[]}),$scope.downloadFile=function(credential,file){var callback=function(result){var key=null;if(!result.hasOwnProperty("file_data"))return void NotificationService.showNotification($translate.instant("error.loading.file.perm"),5e3);!credential.hasOwnProperty("acl")&&credential.hasOwnProperty("shared_key")&&credential.shared_key&&(key=EncryptService.decryptString(angular.copy(credential.shared_key))),credential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy(credential.acl.shared_key)));var file_data=EncryptService.decryptString(result.file_data,key);download(file_data,escapeHTML(file.filename),file.mimetype)};credential.hasOwnProperty("acl")?ShareService.downloadSharedFile(credential,file).then(callback):FileService.getFile(file).then(callback)}}])}(),function(){angular.module("passmanApp").controller("CredentialEditCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","FileService","EncryptService","TagService","NotificationService","ShareService","$translate",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,FileService,EncryptService,TagService,NotificationService,ShareService,$translate){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else if(!$scope.active_vault)return void $location.path("/");VaultService.getVault($scope.active_vault).then(function(vault){vault.vaultKey=VaultService.getActiveVault().vaultKey,delete vault.credentials,VaultService.setActiveVault(vault),$scope.pwSettings=VaultService.getVaultSetting("pwSettings",{length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})}),$scope.currentTab={title:$translate.instant("general"),url:"views/partials/forms/edit_credential/basics.html",color:"blue"},$translate(["general","password","custom.fields","files","otp"]).then(function(translations){$scope.tabs=[{title:translations.general,url:"views/partials/forms/edit_credential/basics.html",color:"blue"},{title:translations.password,url:"views/partials/forms/edit_credential/password.html",color:"green"},{title:translations["custom.fields"],url:"views/partials/forms/edit_credential/custom_fields.html",color:"orange"},{title:translations.files,url:"views/partials/forms/edit_credential/files.html",color:"yellow"},{title:translations.otp,url:"views/partials/forms/edit_credential/otp.html",color:"purple"}],$scope.currentTab=$scope.tabs[0]}),$scope.active_vault&&($scope.$parent.selectedVault=!0);var storedCredential=SettingsService.getSetting("edit_credential");storedCredential?($scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)),$scope.storedCredential.password_repeat=angular.copy($scope.storedCredential.password),$scope.storedCredential.expire_time=1e3*$scope.storedCredential.expire_time):CredentialService.getCredential($routeParams.credential_id).then(function(result){$scope.storedCredential=CredentialService.decryptCredential(angular.copy(result))}),$scope.getTags=function($query){return TagService.searchTag($query)},$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},$scope.pwGenerated=function(pass){$scope.storedCredential.password_repeat=pass};var _customField={label:"",value:"",secret:!1,field_type:"text"};$scope.selected_field_type="text",$scope.new_custom_field=angular.copy(_customField),$scope.addCustomField=function(){var _field=angular.copy($scope.new_custom_field);if(_field.label||NotificationService.showNotification($translate.instant("error.no.label"),3e3),_field.value||NotificationService.showNotification($translate.instant("error.no.value"),3e3),_field.label&&_field.value)if($scope.selected_field_type="text",_field.secret="password"===_field.field_type,"file"===_field.field_type){var key=!1,_file=$scope.new_custom_field.value;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),FileService.uploadFile(_file,key).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename,key),_field.value=result,$scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)})}else $scope.storedCredential.custom_fields.push(_field),
-$scope.new_custom_field=angular.copy(_customField)},$scope.addFileToCustomField=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};$scope.new_custom_field.value=_file,$scope.$digest()},$scope.deleteCustomField=function(field){field.hasOwnProperty("field_type")&&"file"===field.field_type&&FileService.deleteFile(field.value);var idx=$scope.storedCredential.custom_fields.indexOf(field);$scope.storedCredential.custom_fields.splice(idx,1)},$scope.new_file={name:"",data:null},$scope.deleteFile=function(file){var idx=$scope.storedCredential.files.indexOf(file);FileService.deleteFile(file).then(function(){$scope.storedCredential.files.splice(idx,1)})},$scope.fileLoaded=function(file){var key,_file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),FileService.uploadFile(_file,key).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename,key),$scope.storedCredential.files.push(result)}),$scope.$digest()},$scope.fileLoadError=function(error){console.log($translate.instant("error.loading.file"),error)},$scope.selected_file="",$scope.fileprogress=[],$scope.fileSelectProgress=function(progress){progress&&($scope.fileprogress=progress,$scope.$digest())},$scope.renewIntervalValue=0,$scope.renewIntervalModifier="0",$scope.updateInterval=function(renewIntervalValue,renewIntervalModifier){var value=parseInt(renewIntervalValue),modifier=parseInt(renewIntervalModifier);value&&modifier&&($scope.storedCredential.renew_interval=value*modifier)},$scope.parseQR=function(QRCode){var parsedQR,qrInfo,re=/otpauth:\/\/(totp|hotp)\/(.*)\?(secret|issuer)=(.*)&(issuer|secret)=(.*)/;qrInfo=[],parsedQR=QRCode.qrData.match(re),parsedQR&&(qrInfo={type:parsedQR[1],label:decodeURIComponent(parsedQR[2]),qr_uri:QRCode}),qrInfo[parsedQR[3]]=parsedQR[4],qrInfo[parsedQR[5]]=parsedQR[6],$scope.storedCredential.otp=qrInfo,$scope.$digest()},$scope.saveCredential=function(){if($scope.new_custom_field.label&&$scope.new_custom_field.value&&$scope.storedCredential.custom_fields.push(angular.copy($scope.new_custom_field)),delete $scope.storedCredential.password_repeat,$scope.storedCredential.credential_id){var key,_credential;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),_credential=key?ShareService.encryptSharedCredential($scope.storedCredential,key):angular.copy($scope.storedCredential),delete _credential.shared_key;var _useKey=null!=key,regex=/(<([^>]+)>)/gi;_credential.description&&""!==_credential.description&&(_credential.description=_credential.description.replace(regex,"")),CredentialService.updateCredential(_credential,_useKey).then(function(){SettingsService.setSetting("edit_credential",null),$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("credential.updated"),5e3)})}else $scope.storedCredential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential($scope.storedCredential).then(function(){$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("credential.created"),5e3)})},$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id)}}])}(),function(){angular.module("passmanApp").controller("ExportCtrl",["$scope","$window","CredentialService","VaultService","$translate",function($scope,$window,CredentialService,VaultService,$translate){$scope.available_exporters=[],$scope.active_vault=VaultService.getActiveVault(),$scope.$watch(function(){return $window.PassmanExporter},function(exporters){exporters=Object.keys(angular.copy(exporters));for(var i=0;i<exporters.length;i++){var exporter=exporters[i];$window.PassmanExporter[exporter].hasOwnProperty("info")&&$scope.available_exporters.push($window.PassmanExporter[exporter].info)}},!0),$scope.log=[],$scope.setExporter=function(exporter){exporter=JSON.parse(exporter),$scope.selectedExporter=exporter};var _log=function(str){$scope.log.push(str)};$scope.startExport=function(){_log($translate.instant("export.starting"));var _credentials=[];VaultService.getVault(VaultService.getActiveVault()).then(function(vault){if(_log($translate.instant("export.decrypt")),vault.hasOwnProperty("credentials")&&vault.credentials.length>0){for(var i=0;i<vault.credentials.length;i++){var _credential=angular.copy(vault.credentials[i]);0===_credential.hidden&&(_credential=CredentialService.decryptCredential(_credential),_credentials.push(_credential))}$window.PassmanExporter[$scope.selectedExporter.id].export(_credentials).then(function(){_log($translate.instant("done"))})}})}}])}(),function(){angular.module("passmanApp").controller("ImportCtrl",["$scope","$window","CredentialService","VaultService","$translate",function($scope,$window,CredentialService,VaultService,$translate){$scope.available_importers=[],$scope.active_vault=VaultService.getActiveVault(),$scope.$watch(function(){return $window.PassmanImporter},function(importers){for(var key in importers){var importer=importers[key];importer.hasOwnProperty("info")&&$scope.available_importers.push(importer.info)}},!0),$scope.log=[],$scope.setImporter=function(importer){importer=JSON.parse(importer),$scope.selectedImporter=importer};var file_data,_log=function(str){$scope.log.push(str)};$scope.fileLoaded=function(file){file_data=file.data.split(","),file_data=decodeURIComponent(escape(window.atob(file_data[1]))),_log($translate.instant("import.file.read")),$scope.$digest()},$scope.fileLoadError=function(file){console.error($translate.instant("error.loading.file"),file)},$scope.fileSelectProgress=function(){};var parsed_data;$scope.import_progress={progress:0,loaded:0,total:0};var addCredential=function(parsed_data_index){if(parsed_data[parsed_data_index]){var _credential=parsed_data[parsed_data_index];if(!_credential.label)return void(parsed_data[parsed_data_index+1]&&(_log($translate.instant("import.no.label")),addCredential(parsed_data_index+1)));_log($translate.instant("import.adding",{credential:_credential.label})),_credential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential(_credential).then(function(result){result.credential_id&&(_log($translate.instant("import.added",{credential:_credential.label})),parsed_data[parsed_data_index+1]?($scope.import_progress={progress:parsed_data_index/parsed_data.length*100,loaded:parsed_data_index,total:parsed_data.length},addCredential(parsed_data_index+1)):($scope.import_progress={progress:100,loaded:parsed_data.length,total:parsed_data.length},_log($translate.instant("done"))))})}};$scope.file_read_progress={percent:0,loaded:0,total:0},$scope.startImport=function(){$scope.import_progress=0,$scope.file_read_percent=0,file_data&&$window.PassmanImporter[$scope.selectedImporter.id].readFile(file_data).then(function(parseddata){parsed_data=parseddata,$scope.file_read_progress={percent:100,loaded:parsed_data.length,total:parsed_data.length};var msg=$translate.instant("import.loaded").replace("{{num}}",parsed_data.length);_log(msg),parsed_data.length>0&&addCredential(0)}).progress(function(progress){$scope.file_read_progress=progress,$scope.$digest()})}}])}(),function(){angular.module("passmanApp").controller("MainCtrl",["$scope","$rootScope","$location","SettingsService",function($scope,$rootScope,$location,SettingsService){$scope.selectedVault=!1,$scope.http_warning_hidden=!0,"http"===$location.$$protocol&&"localhost"!==$location.$$host&&"127.0.0.1"!==$location.$host&&($scope.using_http=!0,$scope.http_warning_hidden=!1),$rootScope.$on("settings_loaded",function(){"1"!==SettingsService.getSetting("disable_contextmenu")&&1!==SettingsService.getSetting("disable_contextmenu")||document.addEventListener("contextmenu",function(event){event.preventDefault()}),"0"!==SettingsService.getSetting("https_check")&&0!==SettingsService.getSetting("https_check")||($scope.http_warning_hidden=!0)}),$rootScope.setHttpWarning=function(state){$scope.http_warning_hidden=state},$rootScope.$on("app_menu",function(evt,shown){$scope.app_sidebar=shown}),$rootScope.$on("logout",function(){$scope.selectedVault=!1})}])}(),function(){angular.module("passmanApp").controller("MenuCtrl",["$scope","VaultService","$location","$rootScope","TagService","SettingsService",function($scope,VaultService,$location,$rootScope,TagService,SettingsService){$rootScope.logout=function(){SettingsService.setSetting("defaultVaultPass",!1),$rootScope.$broadcast("logout"),$location.path("/")},$scope.selectedTags=[],$scope.getTags=function($query){return TagService.searchTag($query)},$scope.$watch(function(){return VaultService.getActiveVault()},function(vault){$scope.active_vault=vault}),$scope.filtered_tags=[],$rootScope.$on("limit_tags_in_list",function(evt,tags){$scope.filtered_tags=[];for(var i=0;i<tags.length;i++){for(var tag={text:tags[i]},found=!1,x=0;x<$scope.selectedTags.length;x++)$scope.selectedTags[x].text===tag.text&&(found=!0);found===!1&&$scope.filtered_tags.push(tag)}}),$scope.$watch("selectedTags",function(){$rootScope.$broadcast("selected_tags_updated",$scope.selectedTags)},!0),$scope.tagClicked=function(tag){$scope.selectedTags.push(tag)},$scope.available_tags=TagService.getTags(),$scope.$watch(function(){return 0===$scope.selectedTags.length?TagService.getTags():$scope.filtered_tags},function(tags){$scope.available_tags=tags},!0),$scope.toggleDeleteTime=function(){$scope.delete_time>0?$scope.delete_time=0:$scope.delete_time=1,$rootScope.$broadcast("set_delete_time",$scope.delete_time)}}])}(),function(){angular.module("passmanApp").controller("PublicSharedCredential",["$scope","ShareService","$window","EncryptService","NotificationService","$translate",function($scope,ShareService,$window,EncryptService,NotificationService,$translate){var _key;$scope.loading=!1,$scope.loadSharedCredential=function(){$scope.loading=!0;var data=window.atob($window.location.hash.replace("#","")).split("<::>"),guid=data[0];_key=data[1],ShareService.getPublicSharedCredential(guid).then(function(sharedCredential){$scope.loading=!1,200===sharedCredential.status?$scope.shared_credential=ShareService.decryptSharedCredential(sharedCredential.data.credential_data,_key):$scope.expired=!0})},$scope.downloadFile=function(credential,file){ShareService.downloadSharedFile(credential,file).then(function(result){if(!result.hasOwnProperty("file_data"))return void NotificationService.showNotification($translate.instant("error.loading.file.perm"),5e3);var file_data=EncryptService.decryptString(result.file_data,_key);download(file_data,escapeHTML(file.filename),file.mimetype)})}}])}(),function(){angular.module("passmanApp").controller("RevisionCtrl",["$scope","SettingsService","VaultService","CredentialService","$location","$routeParams","$rootScope","NotificationService","$filter","ShareService","EncryptService","$translate",function($scope,SettingsService,VaultService,CredentialService,$location,$routeParams,$rootScope,NotificationService,$filter,ShareService,EncryptService,$translate){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),VaultService.getVault(_vault).then(function(vault){vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(vault),$scope.active_vault=vault,$scope.$parent.selectedVault=!0})}}else $scope.active_vault||$location.path("/");$scope.active_vault&&($scope.$parent.selectedVault=!0);var storedCredential=SettingsService.getSetting("revision_credential"),getRevisions=function(){CredentialService.getRevisions($scope.storedCredential.guid).then(function(revisions){$scope.revisions=revisions})};storedCredential?($scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)),getRevisions()):CredentialService.getCredential($routeParams.credential_id).then(function(result){$scope.storedCredential=CredentialService.decryptCredential(angular.copy(result)),getRevisions()}),$scope.selectRevision=function(revision){var key;$scope.selectedRevision=angular.copy(revision),!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),key?$scope.selectedRevision.credential_data=ShareService.decryptSharedCredential(angular.copy(revision.credential_data),key):$scope.selectedRevision.credential_data=CredentialService.decryptCredential(angular.copy(revision.credential_data)),$rootScope.$emit("app_menu",!0)},$scope.closeSelected=function(){$rootScope.$emit("app_menu",!1),$scope.selectedRevision=!1},$scope.deleteRevision=function(revision){CredentialService.deleteRevision($scope.storedCredential.guid,revision.revision_id).then(function(){for(var i=0;i<$scope.revisions.length;i++)if($scope.revisions[i].revision_id===revision.revision_id){$scope.revisions.splice(i,1),NotificationService.showNotification($translate.instant("revision.deleted"),5e3);break}})},$scope.restoreRevision=function(revision){var key,_revision=angular.copy(revision),_credential=_revision.credential_data;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),key&&(_credential=ShareService.encryptSharedCredential(_credential,key)),delete _credential.shared_key,_credential.revision_created=$filter("date")(1e3*_revision.created,"dd-MM-yyyy @ HH:mm:ss"),CredentialService.updateCredential(_credential,key).then(function(){SettingsService.setSetting("revision_credential",null),$rootScope.$emit("app_menu",!1),$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("revision.restored"),5e3)})},$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id),$scope.storedCredential=null,SettingsService.setSetting("revision_credential",null)}}])}(),function(){angular.module("passmanApp").controller("SettingsCtrl",["$scope","$rootScope","SettingsService","VaultService","CredentialService","$location","$routeParams","$http","EncryptService","NotificationService","$sce","$translate",function($scope,$rootScope,SettingsService,VaultService,CredentialService,$location,$routeParams,$http,EncryptService,NotificationService,$sce,$translate){if($scope.vault_settings={},$scope.new_vault_name="",$scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else if(!$scope.active_vault)return void $location.path("/");VaultService.getVault($scope.active_vault).then(function(vault){vault.vaultKey=VaultService.getActiveVault().vaultKey,delete vault.credentials,VaultService.setActiveVault(vault),$scope.vault_settings=vault.vault_settings,$scope.vault_settings.hasOwnProperty("pwSettings")||($scope.vault_settings.pwSettings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})});var btn_txt=$translate.instant("bookmarklet.text"),http=location.protocol,slashes=http.concat("//"),host=slashes.concat(window.location.hostname),complete=host+location.pathname;$scope.bookmarklet=$sce.trustAsHtml('<a class="button" href="javascript:(function(){var a=window,b=document,c=encodeURIComponent,e=c(document.title),d=a.open(\''+complete+"bookmarklet?url='+c(b.location)+'&title='+e,'bkmk_popup','left='+((a.screenX||a.screenLeft)+10)+',top='+((a.screenY||a.screenTop)+10)+',height=750px,width=475px,resizable=0,alwaysRaised=1');a.setTimeout(function(){d.focus()},300);})();\">"+btn_txt+"</a>"),$scope.saveVaultSettings=function(){var _vault=$scope.active_vault;_vault.name=$scope.new_vault_name,_vault.vault_settings=angular.copy($scope.vault_settings),VaultService.updateVault(_vault).then(function(){$scope.active_vault.name=angular.copy(_vault.name),NotificationService.showNotification($translate.instant("settings.saved"),5e3)})},$scope.tabs=[{title:$translate.instant("settings.general"),url:"views/partials/forms/settings/general_settings.html"},{title:$translate.instant("settings.audit"),url:"views/partials/forms/settings/tool.html"},{title:$translate.instant("settings.password"),url:"views/partials/forms/settings/password_settings.html"},{title:$translate.instant("settings.import"),url:"views/partials/forms/settings/import.html"},{title:$translate.instant("settings.export"),url:"views/partials/forms/settings/export.html"},{title:$translate.instant("settings.sharing"),url:"views/partials/forms/settings/sharing.html"}],$scope.currentTab=$scope.tabs[0],$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url};var getPassmanVersion=function(){var url=OC.generateUrl("apps/passman/api/internal/version");$http.get(url).then(function(result){$scope.passman_version=result.data.version})};getPassmanVersion(),$scope.$watch(function(){return VaultService.getActiveVault()},function(vault){vault&&($scope.active_vault=vault)}),$rootScope.$on("logout",function(){$scope.selectedVault=!1}),$scope.startScan=function(minStrength){VaultService.getVault($scope.active_vault).then(function(vault){for(var results=[],i=0;i<vault.credentials.length;i++){var c=angular.copy(vault.credentials[i]);if(c.password&&0===c.hidden)try{if(c=CredentialService.decryptCredential(c),c.password){var zxcvbn_result=zxcvbn(c.password);zxcvbn_result.score<=minStrength&&results.push({credential_id:c.credential_id,label:c.label,password:c.password,password_zxcvbn_result:zxcvbn_result})}}catch(e){console.warn(e)}}$scope.scan_result=results})},$scope.cur_state={},$scope.$on("$locationChangeStart",function(event){$scope.change_pw&&$scope.change_pw.total>0&&$scope.change_pw.done<$scope.change_pw.total&&(confirm($translate.instant("changepw.navigate.away.warning"))||event.preventDefault())}),$scope.changeVaultPassword=function(oldVaultPass,newVaultPass,newVaultPass2){return oldVaultPass!==VaultService.getActiveVault().vaultKey?void($scope.error=$translate.instant("incorrect.password")):newVaultPass!==newVaultPass2?void($scope.error=$translate.instant("password.no.match")):(SettingsService.setSetting("defaultVault",null),SettingsService.setSetting("defaultVaultPass",null),void VaultService.getVault($scope.active_vault).then(function(vault){var _selected_credentials=[];0===vault.credentials.length&&$location.path("/");for(var i=0;i<vault.credentials.length;i++){var _credential=vault.credentials[i];if(null===_credential.shared_key||""===_credential.shared_key||!_credential.hasOwnProperty("acl")){var _success;try{CredentialService.decryptCredential(_credential,VaultService.getActiveVault().vaultKey),_success=!0}catch(e){_success=!1}_success&&_selected_credentials.push(_credential)}}$scope.change_pw={percent:0,done:0,total:_selected_credentials.length};var changeCredential=function(index,oldVaultPass,newVaultPass){CredentialService.reencryptCredential(_selected_credentials[index].guid,oldVaultPass,newVaultPass).progress(function(data){$scope.cur_state=data}).then(function(){var percent=index/_selected_credentials.length*100;$scope.change_pw={percent:percent,done:index+1,total:_selected_credentials.length},index<_selected_credentials.length-1?changeCredential(index+1,oldVaultPass,newVaultPass):(vault.private_sharing_key=EncryptService.decryptString(angular.copy(vault.private_sharing_key),oldVaultPass),vault.private_sharing_key=EncryptService.encryptString(vault.private_sharing_key,newVaultPass),VaultService.updateSharingKeys(vault).then(function(){$rootScope.$broadcast("logout"),NotificationService.showNotification($translate.instant("login.new.pass"),5e3)}))})};changeCredential(0,VaultService.getActiveVault().vaultKey,newVaultPass)}))},$rootScope.$on("logout",function(){$scope.active_vault=null,VaultService.setActiveVault(null),$location.path("/")}),$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id)}}])}(),function(){angular.module("passmanApp").controller("ShareCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","ShareService","NotificationService","SharingACL","EncryptService","$translate","$rootScope",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,ShareService,NotificationService,SharingACL,EncryptService,$translate,$rootScope){$scope.active_vault=VaultService.getActiveVault(),$scope.tabs=[{title:$translate.instant("share.u.g"),url:"views/partials/forms/share_credential/basics.html"},{title:$translate.instant("share.link"),url:"views/partials/forms/share_credential/link_sharing.html",color:"green"}],$scope.currentTab=$scope.tabs[0];var settingsLoaded=function(){var settings=SettingsService.getSettings();0!==settings.user_sharing_enabled&&"0"!==settings.user_sharing_enabled||$scope.tabs.splice(0,1),0!==settings.link_sharing_enabled&&"0"!==settings.link_sharing_enabled||$scope.tabs.splice(1,1),$scope.tabs.length>0&&($scope.currentTab=$scope.tabs[0])};if(SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else $scope.active_vault||$location.path("/");var storedCredential=SettingsService.getSetting("share_credential");storedCredential?$scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)):$location.path("/vault/"+$routeParams.vault_id),$scope.active_vault&&($scope.$parent.selectedVault=!0),$scope.cancel=function(){SettingsService.setSetting("share_credential",null),$location.path("/vault/"+$routeParams.vault_id)},$scope.default_permissions=new SharingACL(0),$scope.default_permissions.addPermission($scope.default_permissions.permissions.READ|$scope.default_permissions.permissions.WRITE|$scope.default_permissions.permissions.FILES);var link_acl=angular.copy($scope.default_permissions);link_acl.removePermission($scope.default_permissions.permissions.WRITE);var oneMonthLater=new Date;oneMonthLater.setMonth(oneMonthLater.getMonth()+1),$scope.share_settings={linkSharing:{enabled:!1,settings:{expire_time:oneMonthLater,expire_views:5,acl:link_acl}},credentialSharedWithUserAndGroup:[],cypher_progress:{done:0,total:0},upload_progress:{done:0,total:0}};var getAcl=function(){ShareService.getSharedCredentialACL($scope.storedCredential).then(function(aclList){for(var _list=[],enc_key=!!$scope.storedCredential.shared_key&&EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key)),i=0;i<aclList.length;i++){var acl=aclList[i];if(null===acl.user_id){if($scope.share_settings.linkSharing={enabled:!0,settings:{expire_time:new Date(1e3*acl.expire),expire_views:acl.expire_views,acl:new SharingACL(acl.permissions)}},enc_key){var hash=window.btoa($scope.storedCredential.guid+"<::>"+enc_key);$scope.share_link=getShareLink(hash)}}else{var obj={userId:acl.user_id,displayName:acl.user_id,type:"user",acl:new SharingACL(acl.permissions),acl_id:acl.acl_id,pending:acl.pending,credential_guid:acl.item_guid,created:acl.created};_list.push(obj)}}$scope.share_settings.credentialSharedWithUserAndGroup=_list})};getAcl();new SharingACL(0);$scope.$watch("share_settings.upload_progress.done",function(){$scope.share_settings.upload_progress.done===$scope.share_settings.upload_progress.total&&$scope.share_settings.upload_progress.total>0&&getAcl()}),$scope.inputSharedWith=[],$scope.searchUsers=function($query){return ShareService.search($query)},$scope.hasPermission=function(acl,permission){return acl.hasPermission(permission)},$scope.setPermission=function(acl,permission){acl.togglePermission(permission)},$scope.shareWith=function(shareWith){if($scope.inputSharedWith=[],shareWith.length>0)for(var i=0;i<shareWith.length;i++){for(var obj={userId:shareWith[i].uid,displayName:shareWith[i].text,type:shareWith[i].type,acl:angular.copy($scope.default_permissions),pending:!0,credential_guid:$scope.storedCredential.guid},found=!1,z=0;z<$scope.share_settings.credentialSharedWithUserAndGroup.length;z++)$scope.share_settings.credentialSharedWithUserAndGroup[z].userId===shareWith[z].uid&&(found=!0);found===!1&&$scope.share_settings.credentialSharedWithUserAndGroup.push(obj)}},$scope.unshareUser=function(user){ShareService.unshareCredentialFromUser($scope.storedCredential,user.userId).then(function(result){if(result.result===!0){var idx=$scope.share_settings.credentialSharedWithUserAndGroup.indexOf(user);$scope.share_settings.credentialSharedWithUserAndGroup.splice(idx,1)}})},$scope.unshareCredential=function(credential){ShareService.unshareCredential(credential);var _credential=angular.copy(credential),old_key=EncryptService.decryptString(angular.copy(_credential.shared_key)),new_key=VaultService.getActiveVault().vaultKey;_credential.shared_key=null,_credential.unshare_action=!0,_credential.skip_revision=!0,_credential=CredentialService.encryptCredential(_credential,old_key),CredentialService.updateCredential(_credential,!0).then(function(){NotificationService.showNotification($translate.instant("credential.unshared"),4e3),CredentialService.reencryptCredential(_credential.guid,old_key,new_key).then(function(){getAcl()})})},$scope.applyShareToUser=function(user,enc_key){ShareService.getVaultsByUser(user.userId).then(function(data){$scope.share_settings.cypher_progress.total+=data.length,user.vaults=data;var start=(new Date).getTime()/1e3;ShareService.cypherRSAStringWithPublicKeyBulkAsync(user.vaults,enc_key).progress(function(){$scope.share_settings.cypher_progress.done++,$scope.share_settings.cypher_progress.percent=$scope.share_settings.cypher_progress.done/$scope.share_settings.cypher_progress.total*100,$scope.$digest()}).then(function(result){$scope.share_settings.cypher_progress.times.push({time:(new Date).getTime()/1e3-start,user:data[0].user_id}),user.vaults=result,user.hasOwnProperty("acl_id")||$scope.uploadChanges(user),$scope.$digest()})})},$scope.$on("$locationChangeStart",function(event){$scope.sharing_complete||confirm($translate.instant("share.navigate.away.warning"))||event.preventDefault()});var getShareLink=function(hash){var port,defaultPort="http"===$location.$$protocol?80:443;return port=defaultPort!==$location.$$port?":"+$location.$$port:"",$location.$$protocol+"://"+$location.$$host+port+OC.generateUrl("apps/passman/share/public#")+hash};$scope.sharing_complete=!0,$scope.applyShare=function(){if($scope.sharing_complete=!1,$scope.share_settings.cypher_progress.percent=0,$scope.share_settings.cypher_progress.done=0,$scope.share_settings.cypher_progress.total=0,$scope.share_settings.cypher_progress.times=[],$scope.share_settings.cypher_progress.times_total=[],$scope.share_settings.upload_progress.done=0,$scope.share_settings.upload_progress.total=0,$scope.storedCredential.shared_key&&""!==$scope.storedCredential.shared_key&&null!==$scope.storedCredential.shared_key){var enc_key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key));if($scope.share_settings.linkSharing.enabled){var expire_time=new Date(angular.copy($scope.share_settings.linkSharing.settings.expire_time)).getTime()/1e3,shareObj={item_id:$scope.storedCredential.credential_id,item_guid:$scope.storedCredential.guid,permissions:$scope.share_settings.linkSharing.settings.acl.getAccessLevel(),expire_timestamp:expire_time,expire_views:$scope.share_settings.linkSharing.settings.expire_views};ShareService.createPublicSharedCredential(shareObj).then(function(){var hash=window.btoa($scope.storedCredential.guid+"<::>"+enc_key);$scope.share_link=getShareLink(hash)})}for(var list=$scope.share_settings.credentialSharedWithUserAndGroup,i=0;i<list.length;i++){var iterator=i,target_user=list[i];if(target_user.hasOwnProperty("created")){var acl={user_id:target_user.userId,permission:target_user.acl.getAccessLevel()};ShareService.updateCredentialAcl($scope.storedCredential,acl)}else $scope.applyShareToUser(list[iterator],enc_key)}NotificationService.showNotification($translate.instant("saved"),4e3),$scope.sharing_complete=!0}else ShareService.generateSharedKey(20).then(function(key){var encryptedSharedCredential=angular.copy($scope.storedCredential),old_key=VaultService.getActiveVault().vaultKey;CredentialService.reencryptCredential(encryptedSharedCredential.guid,old_key,key).progress(function(){}).then(function(data){var _credential=data.cryptogram;_credential.set_share_key=!0,_credential.skip_revision=!0,_credential.shared_key=EncryptService.encryptString(key),CredentialService.updateCredential(_credential,!0).then(function(){NotificationService.showNotification($translate.instant("credential.shared"),4e3),$scope.sharing_complete=!0})});for(var list=$scope.share_settings.credentialSharedWithUserAndGroup,i=0;i<list.length;i++)"user"===list[i].type&&$scope.applyShareToUser(list[i],key);if($scope.share_settings.linkSharing.enabled){var expire_time=new Date(angular.copy($scope.share_settings.linkSharing.settings.expire_time)).getTime()/1e3,shareObj={item_id:$scope.storedCredential.credential_id,item_guid:$scope.storedCredential.guid,permissions:$scope.share_settings.linkSharing.settings.acl.getAccessLevel(),expire_timestamp:expire_time,expire_views:$scope.share_settings.linkSharing.settings.expire_views};ShareService.createPublicSharedCredential(shareObj).then(function(){var hash=window.btoa($scope.storedCredential.guid+"<::>"+key);$scope.share_link=getShareLink(hash)})}})},$scope.uploadChanges=function(user){$scope.share_settings.upload_progress.total++,user.accessLevel=angular.copy(user.acl.getAccessLevel()),ShareService.shareWithUser(storedCredential,user).then(function(){$scope.share_settings.upload_progress.done++,$scope.share_settings.upload_progress.percent=$scope.share_settings.upload_progress.done/$scope.share_settings.upload_progress.total*100})},$scope.calculate_total_time=function(){$scope.share_settings.cypher_progress.times=$scope.share_settings.cypher_progress.times||[];for(var total=0,i=0;i<$scope.share_settings.cypher_progress.times.length;i++)total+=$scope.share_settings.cypher_progress.times[i].time;
-return total}}])}(),function(){angular.module("passmanApp").controller("SharingSettingsCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","ShareService","EncryptService",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,ShareService,EncryptService){$scope.active_vault=VaultService.getActiveVault(),$scope.sharing_keys=angular.copy(ShareService.getSharingKeys()),$scope.progress=1,$scope.generating=!1,$scope.available_sizes=[{size:1024,name:1024},{size:2048,name:2048},{size:4096,name:4096}],$scope.setKeySize=function(size){for(var i=0;i<$scope.available_sizes.length;i++)if($scope.available_sizes[i].size===size)return void($scope.key_size=$scope.available_sizes[i])},$scope.setKeySize(2048),$scope.generateKeys=function(length){$scope.progress=1,$scope.generating=!0,ShareService.generateRSAKeys(length).progress(function(progress){$scope.progress=progress>0?2:1,$scope.$digest()}).then(function(kp){$scope.generating=!1;var pem=ShareService.rsaKeyPairToPEM(kp);$scope.active_vault.private_sharing_key=EncryptService.encryptString(pem.privateKey),$scope.active_vault.public_sharing_key=pem.publicKey,VaultService.updateSharingKeys($scope.active_vault).then(function(){$scope.sharing_keys=ShareService.getSharingKeys()})})},$scope.updateSharingKeys=function(){$scope.active_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),$scope.active_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),VaultService.updateSharingKeys($scope.active_vault).then(function(){$scope.sharing_keys=ShareService.getSharingKeys()})}}])}(),function(){angular.module("passmanApp").controller("VaultCtrl",["$scope","VaultService","SettingsService","CredentialService","$location","ShareService","EncryptService","$translate","$rootScope",function($scope,VaultService,SettingsService,CredentialService,$location,ShareService,EncryptService,$translate,$rootScope){VaultService.getVaults().then(function(vaults){if($scope.vaults=vaults,null!=SettingsService.getSetting("defaultVault"))for(var default_vault=SettingsService.getSetting("defaultVault"),i=0;i<vaults.length;i++){var vault=vaults[i];if(vault.guid===default_vault.guid){$scope.default_vault=!0,$scope.list_selected_vault=vault,SettingsService.setSetting("defaultVault",vault),SettingsService.getSetting("defaultVaultPass")&&$location.path("/vault/"+vault.guid);break}}});var key_strengths=["password.poor","password.poor","password.weak","password.good","password.strong"];$scope.default_vault=!1,$scope.remember_vault_password=!1,$scope.list_selected_vault=!1,$scope.minimal_value_key_strength=3,$rootScope.$on("settings_loaded",function(){$scope.minimal_value_key_strength=SettingsService.getSetting("vault_key_strength"),$translate(key_strengths[SettingsService.getSetting("vault_key_strength")]).then(function(translation){$scope.required_score={strength:translation}})}),$scope.toggleDefaultVault=function(){$scope.default_vault=!$scope.default_vault,$scope.default_vault===!0?SettingsService.setSetting("defaultVault",$scope.list_selected_vault):SettingsService.setSetting("defaultVault",null)},$scope.toggleRememberPassword=function(){$scope.remember_vault_password=!$scope.remember_vault_password,$scope.remember_vault_password&&(SettingsService.setSetting("defaultVault",$scope.list_selected_vault),$scope.default_vault=!0),$scope.remember_vault_password!==!0&&SettingsService.setSetting("defaultVault",null)},$scope.clearState=function(){$scope.list_selected_vault=!1,$scope.creating_vault=!1,$scope.error=!1},$scope.selectVault=function(vault){$scope.list_selected_vault=vault},$scope.sharing_keys={},$scope.newVault=function(){$scope.creating_vault=!0;var key_size=1024;ShareService.generateRSAKeys(key_size).progress(function(progress){var p=progress>0?2:1,msg=$translate.instant("generating.sharing.keys");msg=msg.replace("%step",p),$scope.creating_keys=msg,$scope.$digest()}).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.sharing_keys.private_sharing_key=pem.privateKey,$scope.sharing_keys.public_sharing_key=pem.publicKey,$scope.$digest()})};var _loginToVault=function(vault,vault_key){var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),delete _vault.credentials,VaultService.setActiveVault(_vault),$location.path("/vault/"+vault.guid)};$scope.vaultDecryptionKey="",$scope.loginToVault=function(vault,vault_key){$scope.error=!1;var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);try{EncryptService.decryptString(vault.challenge_password),$scope.remember_vault_password&&SettingsService.setSetting("defaultVaultPass",vault_key),_loginToVault(vault,vault_key)}catch(e){$scope.error=$translate.instant("invalid.vault.key")}},$scope.createVault=function(vault_name,vault_key,vault_key2){return vault_key!==vault_key2?void($scope.error=$translate.instant("password.do.not.match")):void VaultService.createVault(vault_name).then(function(vault){$scope.vaults.push(vault);var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault),SettingsService.setSetting("defaultVaultPass",null),SettingsService.setSetting("defaultVault",null);var test_credential=CredentialService.newCredential();test_credential.label="Test key for vault "+vault_name,test_credential.hidden=!0,test_credential.vault_id=vault.vault_id,test_credential.password="lorum ipsum",CredentialService.createCredential(test_credential).then(function(){_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),VaultService.updateSharingKeys(_vault).then(function(){_loginToVault(vault,vault_key)})})})}}])}(),angular.module("templates-main",["views/credential_revisions.html","views/edit_credential.html","views/partials/forms/edit_credential/basics.html","views/partials/forms/edit_credential/custom_fields.html","views/partials/forms/edit_credential/files.html","views/partials/forms/edit_credential/otp.html","views/partials/forms/edit_credential/password.html","views/partials/forms/settings/export.html","views/partials/forms/settings/general_settings.html","views/partials/forms/settings/import.html","views/partials/forms/settings/password_settings.html","views/partials/forms/settings/sharing.html","views/partials/forms/settings/tool.html","views/partials/forms/share_credential/basics.html","views/partials/forms/share_credential/link_sharing.html","views/partials/password-meter.html","views/settings.html","views/share_credential.html","views/show_vault.html","views/vaults.html"]),angular.module("views/credential_revisions.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/credential_revisions.html",'<div id="controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'showing.revisions\' | translate}} "{{storedCredential.label}}"</a></div></div></div></div><div off-click="closeSelected()"><table class="credential-table" ng-init="menuOpen = false;"><tr ng-repeat="revision in revisions | orderBy:\'-created\'" ng-click="selectRevision(revision)" ng-class="{\'selected\': selectedRevision.revision_id == revision.revision_id}"><td><span class="icon"><i class="fa fa-lock"></i></span> <span class="label">{{ \'revision.of\' | translate}} {{revision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} ({{revision.credential_data.label}}) <span ng-if="revision.edited_by">{{ \'revision.edited.by\' | translate}} {{revision.edited_by}}</span></span></td></tr><tr ng-show="revisions.length == 0"><td>{{ \'no.revisions\' | translate}}</td></tr></table><div id="app-sidebar" class="detailsView scroll-container app_sidebar" ng-show="selectedRevision"><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span> <b ng-show="selectedRevision">{{ \'revision.of\' | translate}} {{selectedRevision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</b><table class="revision-details"><tr ng-show="selectedRevision.credential_data.label"><td>{{ \'label\' | translate}}</td><td>{{selectedRevision.credential_data.label}}</td></tr><tr ng-show="selectedRevision.credential_data.username"><td>{{ \'account\' | translate}}</td><td><span credential-field value="selectedRevision.credential_data.username"></span></td></tr><tr ng-show="selectedRevision.credential_data.password"><td>{{ \'password\' | translate}}</td><td><span credential-field value="selectedRevision.credential_data.password" secret="\'true\'"></span></td></tr><tr ng-show="selectedRevision.credential_data.otp.secret"><td>{{ \'otp\' | translate}}</td><td><span otp-generator secret="selectedRevision.credential_data.otp.secret"></span></td></tr><tr ng-show="selectedRevision.credential_data.email"><td>{{ \'email\' | translate}}</td><td><span credential-field value="selectedRevision.credential_data.email"></span></td></tr><tr ng-show="selectedRevision.credential_data.url"><td>{{ \'url\' | translate}}</td><td><span credential-field value="selectedRevision.url"></span></td></tr><tr ng-show="selectedRevision.credential_data.files.length > 0"><td>{{ \'files\' | translate}}</td><td><div ng-repeat="file in selectedRevision.credential_data.files" class="link" ng-click="downloadFile(file)">{{file.filename}} ({{file.size | bytes}})</div></td></tr><tr ng-repeat="field in selectedRevision.credential_data.custom_fields"><td>{{field.label}}</td><td><span credential-field value="field.value" secret="field.secret"></span></td></tr><tr ng-show="selectedRevision.credential_data.changed"><td>{{ \'changed\' | translate}}</td><td>{{selectedRevision.credential_data.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td></tr><tr ng-show="selectedRevision.credential_data.created"><td>{{ \'created\' | translate}}</td><td>{{selectedRevision.credential_data.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td></tr></table><div ng-show="selectedRevision"><button class="button" ng-click="restoreRevision(selectedRevision)"><span class="fa fa-edit"></span> {{ \'restore.revision\' | translate}}</button> <button class="button" ng-click="deleteRevision(selectedRevision)"><span class="fa fa-trash"></span> {{ \'delete.revision\' | translate}}</button></div></div></div>')}]),angular.module("views/edit_credential.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/edit_credential.html",'<div id="controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'edit.credential\' | translate}} "{{storedCredential.label}}"</a> <a ng-if="!storedCredential.credential_id">{{ \'create.credential\' | translate}}</a></div></div></div></div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="{active:isActiveTab(tab)}" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container edit_credential" use-theme type="\'border-top-color\'"><div ng-include="currentTab.url"></div><button ng-click="saveCredential()">{{ \'save\' | translate}}</button> <button ng-click="cancel()">{{ \'cancel\' | translate}}</button></div>')}]),angular.module("views/partials/forms/edit_credential/basics.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/basics.html",'<div class="row"><div class="col-xs-12 col-md-6"><label>{{ \'label\' | translate}}</label><div><input type="text" ng-model="storedCredential.label"></div><label>{{ \'username\' | translate}}</label><div><input type="text" ng-model="storedCredential.username"></div><label>{{ \'email\' | translate}}</label><div><input type="text" ng-model="storedCredential.email"></div><label>{{ \'password\' | translate}}</label><div><password-gen ng-model="storedCredential.password" settings="pwSettings" callback="pwGenerated"></password-gen><ng-password-meter password="storedCredential.password"></ng-password-meter></div><div><label>{{ \'password.r\' | translate}}</label><input type="password" ng-model="storedCredential.password_repeat"></div><label>{{ \'url\' | translate}}</label><div><input type="text" ng-model="storedCredential.url"></div></div><div class="col-xs-12 col-md-6"><label>{{ \'notes\' | translate}}</label><div><textarea class="credential_textarea" ng-model="storedCredential.description"></textarea></div><label>{{ \'add.tag\' | translate}}</label><div class="tags_input"><tags-input ng-model="storedCredential.tags" replace-spaces-with-dashes="false"><auto-complete source="getTags($query)" min-length="0"></auto-complete></tags-input></div></div></div>')}]),angular.module("views/partials/forms/edit_credential/custom_fields.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/custom_fields.html",'<div class="row"><div class="col-xs-12 col-md-4"><label>{{ \'field.label\' | translate}}</label><input type="text" ng-model="new_custom_field.label"></div><div class="col-xs-10 col-md-6 field-value"><div class="row"><div class="col-xs-12"><label>{{ \'field.value\' | translate}}</label></div></div><div class="row"><div class="col-xs-8 valueInput"><input type="text" ng-model="new_custom_field.value" ng-show="selected_field_type === \'text\'"><password-gen ng-model="new_custom_field.value" ng-show="selected_field_type ===\'password\'" settings="{generateOnCreate: false }"></password-gen><span ng-show="selected_field_type ===\'file\'"><input id="custom_field_file" class="inputfile" type="file" file-select success="addFileToCustomField" error="fileLoadError" progress="fileSelectProgress"><label for="custom_field_file"><i class="fa fa-upload" aria-hidden="true"></i> {{ new_custom_field.value.filename || \'select.file\' | translate}}</label></span></div><div class="col-xs-4 selectType"><select class="form-control" ng-model="new_custom_field.field_type"><option value="text">{{ \'text\' | translate}}</option><option value="password">{{ \'password\' | translate}}</option><option value="file">{{ \'file\' | translate}}</option></select></div></div><div class="row"><div class="col-xs-12"><ng-password-meter ng-if="new_custom_field.field_type ===\'password\'" password="new_custom_field.value"></ng-password-meter></div></div></div><div class="col-xs-2 col-md-2"><label class="invisible">{{\'add\' | translate}}</label><button ng-click="addCustomField()">+</button></div></div><div class="row custom_fields" ng-if="storedCredential.custom_fields.length > 0"><div class="col-xs-12 table"><table><thead><tr use-theme><td class="dragger"></td><th class="field_label">{{ \'label\' | translate}}</th><th class="field_value">{{ \'value\' | translate}}</th><th class="field_secret">{{ \'type\' | translate}}</th><th class="field_actions">{{ \'actions\' | translate}}</th></tr></thead><tbody ui-sortable ng-model="storedCredential.custom_fields"><tr ng-repeat="field in storedCredential.custom_fields"><td class="dragger"><i class="fa fa-arrows-v"></i></td><td><a href="#" editable-text="field.label">{{ field.label || "empty" }}</a></td><td><span ng-if="field.field_type === \'text\'"><a href="#" editable-text="field.value">{{ field.value || \'empty\' | translate }}</a></span> <span ng-if="field.field_type === \'password\'"><a href="#" editable-password="field.value"><span ng-repeat="n in [] | range:field.value.length">*</span></a></span> <span ng-if="field.field_type === \'file\'">{{field.value.filename}} ({{field.value.size | bytes}})</span></td><td>{{ field.field_type }}</td><td class="field_actions"><i class="fa fa-trash" ng-click="deleteCustomField(field)"></i></td></tr></tbody></table></div></div>')}]),angular.module("views/partials/forms/edit_credential/files.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/files.html",'<div class="row file_tab"><div class="col-xs-12 col-md-6"><input class="inputfile" id="file" type="file" file-select success="fileLoaded" error="fileLoadError" progress="fileSelectProgress"><label for="file"><i class="fa fa-upload" aria-hidden="true"></i> {{\'select.file\' | translate}}</label><span ng-if="fileprogress.file_percent > 0"><div progress-bar="fileprogress.file_percent"></div></span></div></div><div class="row files" ng-if="storedCredential.files.length > 0"><div class="col-xs-12 table"><table><thead use-theme><tr><th class="field_label">{{ \'file.name\' | translate }}</th><th class="field_value">{{ \'upload.date\' | translate}}</th><th class="field_secret">{{ \'size\' | translate}}</th><th class="field_actions">{{ \'actions\' | translate}}</th></tr></thead><tr ng-repeat="file in storedCredential.files"><td><a href="#" editable-text="file.filename">{{ file.filename || "empty" }}</a></td><td>{{file.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td><td>{{file.size | bytes}}</td><td class="field_actions"><i class="fa fa-trash" ng-click="deleteFile(file)"></i></td></tr></table></div></div>')}]),angular.module("views/partials/forms/edit_credential/otp.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/otp.html",'<div class="row"><div class="col-xs-12"><div class="col-xs-2 nopadding">{{ \'upload.qr\' | translate}}</div><div class="col-xs-6 nopadding"><input type="file" qrread on-read="parseQR(qrdata)" class="input_secret" on-read="parseQR(qrdata)"></div></div></div><div class="row"><div class="col-xs-12" ng-if="storedCredential.otp">{{ \'current.qr\' | translate}}</div></div><div class="row"><div class="col-xs-5 col-sm-4 col-md-2" ng-if="storedCredential.otp.qr_uri"><img ng-src="{{storedCredential.otp.qr_uri.image}}"></div><div class="col-sm-4 col-sm-5 col-md-5"><table ng-show="storedCredential.otp"><tr ng-show="storedCredential.otp.type"><td>{{ \'type\' | translate}}:</td><td>{{storedCredential.otp.type}}</td></tr><tr ng-show="storedCredential.otp.label"><td>{{ \'label\' | translate}}:</td><td>{{storedCredential.otp.label}}</td></tr><tr ng-show="storedCredential.otp.issuer"><td>{{ \'issuer\' | translate}}:</td><td>{{storedCredential.otp.issuer}}</td></tr><tr ng-show="storedCredential.otp.secret"><td>{{ \'secret\' | translate}}:</td><td>{{storedCredential.otp.secret}}</td></tr><tr ng-show="storedCredential.otp.secret"><td>{{ \'otp\' | translate}}:</td><td><span otp-generator secret="storedCredential.otp.secret"></span></td></tr></table></div></div>')}]),angular.module("views/partials/forms/edit_credential/password.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/password.html",'<div class="row"><div class="col-xs-12 col-md-5 col-lg-5"><label>{{ \'password\' | translate}}</label><div><password-gen ng-model="storedCredential.password" settings="pwSettings" callback="pwGenerated"></password-gen><ng-password-meter password="storedCredential.password"></ng-password-meter></div><label>{{ \'password.r\' | translate}}</label><div><input type="password" ng-model="storedCredential.password_repeat"></div><label>{{ \'expire.date\' | translate}}</label><div><span datetime-picker ng-model="storedCredential.expire_time" class="link" future-only ng-show="storedCredential.expire_time == 0" close-on-select="false">{{\'no.expire.date\' | translate}}</span> <span datetime-picker ng-model="storedCredential.expire_time" class="link" future-only ng-show="storedCredential.expire_time != 0" close-on-select="false">{{ storedCredential.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span></div><label>{{ \'renew.interval\' | translate}}</label><div><input type="number" ng-model="renewIntervalValue" min="0" ng-change="updateInterval(renewIntervalValue, renewIntervalModifier)"><select ng-model="renewIntervalModifier" ng-change="updateInterval(renewIntervalValue, renewIntervalModifier)"><option value="0">{{ \'disabled\' | translate}}</option><option value="86400">{{ \'days\' | translate }}</option><option value="604800">{{ \'weeks\' | translate}}</option><option value="2592000">{{ \'months\' | translate}}</option><option value="31622400">{{ \'years\' | translate}}</option></select></div></div><div class="col-xs-12 col-md-7 col-lg-7"><b>{{ \'generation.settings\' | translate}}</b><div class="row"><div class="password_settings"><div class="col-xs-12 col-sm-5 col-lg-4"><label><span class="label">{{ \'password.generation.length\' | translate}}</span><br><input type="number" ng-model="pwSettings.length" min="1"></label><label><span class="label">{{\'password.generation.min_digits\' | translate}}</span><br><input type="number" ng-model="pwSettings.minimumDigitCount" min="0"></label></div><div class="col-xs-12 col-sm-6 col-lg-6"><label><input type="checkbox" ng-model="pwSettings.useUppercase"> <span class="label sm">{{ \'password.generation.uppercase\' | translate}}</span></label><label><input ng-model="pwSettings.useLowercase" type="checkbox" id="lower"> <span class="label sm">{{ \'password.generation.lowercase\' | translate}}</span></label><label><input ng-model="pwSettings.useDigits" type="checkbox" id="digits"> <span class="label sm">{{ \'password.generation.digits\' | translate}}</span></label><label><input type="checkbox" id="special" ng-model="pwSettings.useSpecialChars"> <span class="label sm">{{ \'password.generation.special\' | translate}}</span></label><label><input type="checkbox" id="ambig" ng-model="pwSettings.avoidAmbiguousCharacters"> <span class="label sm">{{ \'password.generation.ambiguous\' | translate}}</span></label><label><input type="checkbox" ng-model="pwSettings.requireEveryCharType" id="reqevery"> <span class="label sm">{{ \'password.generation.require_same\' | translate}}</span></label></div></div></div></div></div>')}]),angular.module("views/partials/forms/settings/export.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/export.html",'<div ng-controller="ExportCtrl"><div class="row"><div class="col-xs-6"><label>{{ \'export.type\' | translate}}<select ng-init="raw" ng-model="raw" ng-change="setExporter(raw)"><option ng-repeat="exporter in available_exporters" value="{{exporter}}">{{exporter.name}}</option></select></label><div><b>{{selectedExporter.description}}</b></div><button class="button" ng-click="startExport()" ng-if="selectedExporter">{{ \'export\' | translate}}</button></div><div class="col-xs-6"><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div></div>')}]),angular.module("views/partials/forms/settings/general_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/general_settings.html",'<div class="row"><div class="col-xs-12 col-md-6"><h3>{{ \'rename.vault\' | translate}}</h3><label>{{ \'rename.vault.name\' | translate}}</label><input type="text" ng-model="$parent.new_vault_name"> <button ng-click="saveVaultSettings()">{{ \'change\' | translate}}</button><h3>{{ \'change.vault.key\' | translate}}</h3><label>{{ \'old.vault.password\' | translate}}</label><input type="password" ng-model="oldVaultPass"><label>{{ \'new.vault.password\' | translate}}</label><password-gen ng-model="newVaultPass"></password-gen><ng-password-meter password="newVaultPass"></ng-password-meter><label>{{ \'new.vault.pw.r\' | translate}}</label><input type="password" ng-model="newVaultPass2"><div ng-show="error" class="error"><ul><li>{{error}}</li></ul></div><button ng-click="changeVaultPassword(oldVaultPass,newVaultPass,newVaultPass2)">{{ \'change\' | translate}}</button><div ng-show="change_pw.total > 0">{{\'warning.leave\' | translate}}<br>{{ \'processing\' | translate}} {{cur_state.process}}<div progress-bar="cur_state.calculated" index="cur_state.current" total="cur_state.total"></div>{{ \'total.progress\' | translate}}<div progress-bar="change_pw.percent" index="change_pw.done" total="change_pw.total"></div></div></div><div class="col-xs-12 col-md-6"><h3>{{ \'about.passman\' | translate}}</h3><p>{{ \'version\' | translate}}: <b>{{passman_version}}</b><br><br><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6YS8F97PETVU2" target="_blank" class="link">{{ \'donate.support\' | translate}}</a><br></p><h3>{{ \'bookmarklet\' | translate}}</h3><div><p>{{ \'bookmarklet.info1\' | translate}}<br>{{ \'bookmarklet.info2\' | translate}}<br></p></div><div><p ng-bind-html="bookmarklet" style="margin-top: 5px"></p></div></div></div>')}]),angular.module("views/partials/forms/settings/import.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/import.html",'<div ng-controller="ImportCtrl"><div class="row"><div class="col-xs-6"><label>{{ \'import.type\' | translate}}<select ng-init="importerType" ng-model="importerType" ng-change="setImporter(importerType)"><option ng-repeat="importer in available_importers" value="{{importer}}">{{importer.name}}</option></select></label><div><b>{{selectedImporter.description}}</b></div><input ng-if="selectedImporter" type="file" file-select success="fileLoaded" error="fileLoadError" progress="fileSelectProgress"><br><button class="button" ng-click="startImport()" ng-if="selectedImporter">{{ \'import\' | translate}}</button><div ng-if="file_read_progress.percent > 0">{{ \'read.progress\' | translate}}<div progress-bar="file_read_progress.percent" index="file_read_progress.loaded" total="file_read_progress.total"></div></div><div ng-if="import_progress.progress > 0">{{ \'upload.progress\' | translate}}<div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div></div></div><div class="col-xs-6"><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div></div>')}]),angular.module("views/partials/forms/settings/password_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/password_settings.html",'<div class="password_settings"><div class="col-xs-12 col-sm-5 col-lg-4"><label><span class="label">{{ \'password.generation.length\' | translate}}</span><br><input type="number" ng-model="vault_settings.pwSettings.length" min="1"></label><label><span class="label">{{ \'password.generation.min_digits\' | translate}}</span><br><input type="number" ng-model="vault_settings.pwSettings.minimumDigitCount" min="0"></label><label><span class="label">Generate password on creation</span><br><input type="checkbox" ng-model="vault_settings.pwSettings.generateOnCreate" min="0"></label></div><div class="col-xs-12 col-sm-6 col-lg-6"><label><input type="checkbox" ng-model="vault_settings.pwSettings.useUppercase"> <span class="label sm">{{ \'password.generation.uppercase\' | translate}}</span></label><label><input ng-model="vault_settings.pwSettings.useLowercase" type="checkbox" id="lower"> <span class="label sm">{{ \'password.generation.lowercase\' | translate}}</span></label><label><input ng-model="vault_settings.pwSettings.useDigits" type="checkbox" id="digits"> <span class="label sm">{{ \'password.generation.digits\' | translate}}</span></label><label><input type="checkbox" id="special" ng-model="vault_settings.pwSettings.useSpecialChars"> <span class="label sm">{{ \'password.generation.special\' | translate}}</span></label><label><input type="checkbox" id="ambig" ng-model="vault_settings.pwSettings.avoidAmbiguousCharacters"> <span class="label sm">{{ \'password.generation.ambiguous\' | translate}}</span></label><label><input type="checkbox" ng-model="vault_settings.pwSettings.requireEveryCharType" id="reqevery"> <span class="label sm">{{ \'password.generation.require_same\' | translate}}</span></label></div></div><div class="row"><div class="col-xs-12"><button class="button" ng-click="saveVaultSettings()">{{ \'save\' | translate}}</button></div></div>')}]),angular.module("views/partials/forms/settings/sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/sharing.html",'<div ng-controller="SharingSettingsCtrl"><div class="row"><div class="col-md-6"><label>{{ \'priv.key\' | translate}}</label><textarea class="col-md-12">{{sharing_keys.private_sharing_key}}</textarea></div><div class="col-md-6"><label>{{ \'pub.key\' | translate}}</label><textarea class="col-md-12">{{sharing_keys.public_sharing_key}}</textarea></div></div><div class="row"><div class="col-md-12"><label>{{ \'key.size\' | translate}}<select ng-model="key_size" ng-options="size.name for size in available_sizes"></select><button ng-click="updateSharingKeys()"><i class="fa fa-fa-floppy-o"></i> {{ \'save.keys\' | translate}}</button> <button ng-if="!generating" ng-click="generateKeys(key_size.size)">{{ \'gen.keys\' | translate}}</button> <button ng-if="generating"><i class="fa fa-spinner fa-spin"></i> {{ \'generating.keys\' | translate}} ({{progress}}/2)</button></label></div></div></div>')}]),angular.module("views/partials/forms/settings/tool.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/tool.html",'<div class="row"><div class="col-xs-12"><p>{{ \'tool.intro\' | translate}}</p></div><div class="col-xs-12" ng-init="minStrength = 3;">{{ \'min.strength\' | translate}} <input type="number" min="1" max="4" value="3" ng-model="minStrength"> <button ng-click="startScan(minStrength)">Start scan</button></div></div><div class="row" ng-show="scan_result"><div class="col-xs-12"><p>{{ \'scan.result.msg\' | translate}}<br><span translate="scan.result" translate-values="{ scan_result: scan_result.length}"></span><br></p><table class="table scan-result-table"><thead><tr><td>{{ \'label\' | translate}}</td><td>{{ \'score\' | translate}}</td><td>{{ \'password\' | translate}}</td><td>{{ \'action\' | translate}}</td></tr></thead><tbody><tr ng-repeat="result in scan_result | orderBy:\'password_zxcvbn_result.score\'"><td>{{result.label}}</td><td class="score"><ng-password-meter password="result.password"></ng-password-meter></td><td><span credential-field value="result.password" secret="\'true\'"></span></td><td><a class="link" ng-href="#/vault/{{active_vault.vault_id}}/edit/{{result.credential_id}}" tooltip="\'Edit credential\'"><i class="fa fa-edit"></i></a></td></tr></tbody></table></div></div>')}]),angular.module("views/partials/forms/share_credential/basics.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/basics.html",'<div class="row"><div class="col-xs-12 col-md-6"><div><table class="table sharing_table"><thead><tr><td><tags-input ng-model="inputSharedWith" replace-spaces-with-dashes="false" add-from-autocomplete-only="true" placeholder="{{ \'search.u.g\' | translate}}"><auto-complete source="searchUsers($query)" min-length="0" template="autocomplete-template"></auto-complete></tags-input></td><td><button class="button" ng-click="shareWith(inputSharedWith, selectedAccessLevel)">+</button></td></tr></thead></table><div ng-if="share_settings.cypher_progress.done > 0">{{\'cyphering\' | translate}}...<div progress-bar="share_settings.cypher_progress.percent" index="share_settings.cypher_progress.done" total="share_settings.cypher_progress.total"></div></div><div ng-if="share_settings.upload_progress.done > 0">{{ \'uploading\' | translate}}...<div progress-bar="share_settings.upload_progress.percent" index="share_settings.upload_progress.done" total="share_settings.upload_progress.total"></div></div></div></div><div class="col-xs-12 col-md-6" ng-show="share_settings.cypher_progress.times.length > 0"><table class="table"><thead><tr><td>{{ \'user\' | translate}}</td><td>{{ \'crypto.time\' | translate}}</td></tr></thead><tr ng-repeat="user in share_settings.cypher_progress.times"><td><i class="fa fa-cogs"></i> {{user.user}}</td><td>{{user.time}} s</td></tr></table>{{ \'crypto.total.time\' | translate}}: {{ calculate_total_time() }}</div></div><div class="row"><div class="col-xs-12 col-md-6"><table class="table shared_table" ng-show="share_settings.credentialSharedWithUserAndGroup.length > 0"><thead><tr><td>{{\'user\' | translate}}</td><td>{{ \'perm.read\' | translate}}</td><td>{{ \'perm.write\' | translate}}</td><td>{{ \'perm.files\' | translate}}</td><td>{{ \'perm.revisions\' | translate}}</td><td></td></tr></thead><tr ng-repeat="user in share_settings.credentialSharedWithUserAndGroup"><td><i class="fa fa-user" ng-if="user.pending === false"></i> <i class="fa fa-user-times" ng-if="user.pending === true"></i> {{user.userId}} <small ng-if="user.pending === true" class="pull-right col-xs-4">{{ \'pending\' | translate}}</small></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.READ)" ng-checked="hasPermission(user.acl, default_permissions.permissions.READ)"></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.WRITE)" ng-checked="hasPermission(user.acl, default_permissions.permissions.WRITE)"></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.FILES)" ng-checked="hasPermission(user.acl, default_permissions.permissions.FILES)"></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.HISTORY)" ng-checked="hasPermission(user.acl, default_permissions.permissions.HISTORY)"></td><td><i class="fa fa-trash" ng-click="unshareUser(user)"></i></td></tr></table></div></div><script type="text/ng-template" id="autocomplete-template"><i class="fa fa-user" ng-if="data.type === \'user\'"></i>\n\t<i class="fa fa-group" ng-if="data.type === \'group\'"></i>\n\t{{data.text}}</script>');
-}]),angular.module("views/partials/forms/share_credential/link_sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/link_sharing.html",'<div class="row"><div class="col-xs-12 col-md-6"><label><input type="checkbox" ng-model="share_settings.linkSharing.enabled"> {{ \'enable.link.sharing\' | translate}}.</label><br><input type="text" ng-model="share_link" select-on-click placeholder="{{ \'click.share\' | translate}}!" ng-if="share_settings.linkSharing.enabled"><div ng-show="share_settings.linkSharing.enabled">{{ \'share.until.date\' | translate}} <span datetime-picker ng-model="share_settings.linkSharing.settings.expire_time" class="link" future-only close-on-select="false" timestamp="true">{{ share_settings.linkSharing.settings.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\' }}</span></div><div ng-show="share_settings.linkSharing.enabled">{{ \'expire.views\' | translate}}<br><input type="number" ng-model="share_settings.linkSharing.settings.expire_views"></div><div ng-if="share_settings.linkSharing.enabled"><table><tr><td><input type="checkbox" ng-click="setPermission(share_settings.linkSharing.settings.acl, default_permissions.permissions.FILES)" ng-checked="hasPermission(share_settings.linkSharing.settings.acl, default_permissions.permissions.FILES)"></td><td>{{ \'show.files\' | translate}}</td></tr></table></div></div></div>')}]),angular.module("views/partials/password-meter.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/password-meter.html",'<div class="pass-meter {{masterClass}}" off-click="matchBreakdown = false;"><div class="{{colClass}} pass-meter-col {{first}}"><div class="indicator"></div></div><div class="{{colClass}} pass-meter-col {{second}}"><div class="indicator"></div></div><div class="{{colClass}} pass-meter-col {{third}}"><div class="indicator"></div></div><div class="{{colClass}} pass-meter-col {{fourth}}"><div class="indicator"></div></div><div class="details" ng-click="toggleScore()"><span ng-show="!scoreShown">{{ \'details\' | translate }}</span> <span ng-show="scoreShown">{{ \'hide.details\' | translate}}</span></div><div class="pass-meter-message">{{message}}</div><div class="detail_box" ng-show="scoreShown"><div class="row"><div class="col-xs-6">{{ \'password.score\' | translate}}:</div><div class="col-xs-6">{{score.score}}</div></div><div><b>{{ \'cracking.times\' | translate}}</b></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.100h\' | translate}}<br><small>{{ \'cracking.time.100h.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.online_throttling_100_per_hour}}</div></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.10s\' | translate}}<br><small>{{ \'cracking.time.10s.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.online_no_throttling_10_per_second}}</div></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.10ks\' | translate}}<br><small>{{ \'cracking.time.10ks.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.offline_slow_hashing_1e4_per_second}}</div></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.10Bs\' | translate}}<br><small>{{ \'cracking.time.10Bs.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.offline_fast_hashing_1e10_per_second}}</div></div><div class="row"><div class="col-xs-6">{{ \'match.sequence\' | translate}}:</div><div class="col-xs-6"><span class="link" ng-click="toggleMatchBreakdown()">{{ \'match.sequence.link\' | translate}}</span></div></div></div></div><div class="match-sequence"><div class="sequence_container" ng-style="{\'width\': score.sequence.length * 210 }"><div class="sequence" ng-repeat="sequence in score.sequence"><table><tr><td colspan="2" class="token"><code>{{sequence.token}}</code></td></tr><tr ng-if="sequence.pattern"><td>{{ \'pattern\' | translate}}</td><td>{{sequence.pattern}}</td></tr><tr ng-if="sequence.matched_word"><td>{{ \'matched.word\' | translate}}</td><td>{{sequence.matched_word}}</td></tr><tr ng-if="sequence.dictionary_name"><td>{{ \'dictionary.name\' | translate}}</td><td>{{sequence.dictionary_name}}</td></tr><tr ng-if="sequence.rank"><td>{{ \'rank\' | translate}}</td><td>{{sequence.rank}}</td></tr><tr ng-if="sequence.reversed"><td>{{ \'reversed\' | translate}}</td><td>{{sequence.reversed}}</td></tr><tr ng-if="sequence.guesses"><td>{{ \'guesses\' | translate}}</td><td>{{sequence.guesses}}</td></tr><tr ng-if="sequence.base_guesses"><td>{{ \'base.guesses\' | translate}}</td><td>{{sequence.base_guesses}}</td></tr><tr ng-if="sequence.uppercase_variations"><td>{{ \'uppercase.variations\' | translate}}</td><td>{{sequence.uppercase_variations}}</td></tr><tr ng-if="sequence.l33t_variations"><td>{{ \'leet.variations\' | translate}}</td><td>{{sequence.l33t_variations}}</td></tr></table></div></div></div>')}]),angular.module("views/settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/settings.html",'<div id="controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last"><a>{{ \'settings\' | translate}}</a></div></div></div></div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="{active:isActiveTab(tab)}" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container edit_credential"><div ng-include="currentTab.url"></div></div>')}]),angular.module("views/share_credential.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/share_credential.html",'<div id="controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'share.credential\' | translate}} {{storedCredential.label}}</a></div></div></div></div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="{active:isActiveTab(tab)}" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container share_credential" ng-show="currentTab"><div ng-include="currentTab.url"></div><button ng-click="applyShare()">{{ \'share\' | translate}}</button> <button ng-click="cancel()">{{ \'cancel\' | translate}}</button> <button class="btn btn-danger" ng-click="unshareCredential(storedCredential)">{{ \'unshare\' | translate}}</button></div>')}]),angular.module("views/show_vault.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/show_vault.html",'<div off-click="closeSelected()" off-click-filter="\'.download-js-link, .sidebar-shown\'"><div id="passman-controls" ng-class="{ \'sidebar-shown\': selectedCredential }"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a><i class="fa fa-home"></i></a></div><div class="crumb svg last"><a>{{active_vault.name}}</a></div></div></div><span class="title" ng-if="delete_time">{{ \'deleted.since\' | translate }}: <span ng-if="delete_time == 1">All time</span> <span ng-if="delete_time > 1">{{delete_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span></span><div class="actions creatable"><span ng-click="addCredential()" class="button new"><span>+</span></span></div><div class="title" ng-show="filtered_credentials.length > 0" translate="number.filtered" translate-values="{number_filtered: filtered_credentials.length, credential_number: active_vault.credentials.length - 1}"></div><div class="searchboxContainer" ng-init="filterOptionShown = false;" off-click="filterOptionShown = false;"><input type="text" ng-model="filterOptions.filterText" class="searchbox" id="searchBox" placeholder="{{\'search.credential\' | translate}}" select-on-click clear-btn ng-click="filterOptionShown = true;"><div class="searchOptions" ng-show="filterOptionShown"><input type="checkbox" ng-model="filterOptions.useRegex"> Use regex</div></div><div class="viewModes"><div class="view-mode" ng-class="{\'active\': view_mode === \'list\' }" ng-click="switchViewMode(\'list\')"><i class="fa fa-list"></i></div><div class="view-mode" ng-class="{\'active\': view_mode === \'grid\' }" ng-click="switchViewMode(\'grid\')"><i class="fa fa-th-large"></i></div></div></div><div class="loaderContainer" ng-if="show_spinner"><div class="loader" use-theme type="\'border-bottom-color\'"></div></div><div ng-init="menuOpen = false;"><table class="credential-table" ng-if="view_mode === \'list\'"><tr ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="showCredentialRow(credential)" ng-click="selectCredential(credential)" ng-dblclick="editCredential(credential)" ng-class="{\'selected\': selectedCredential.credential_id == credential.credential_id}"><td><span class="tags"><span class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</span></span> <span class="icon"><i class="fa fa-lock" ng-if="!credential.acl && !credential.shared_key"></i> <i class="fa fa-share-alt" ng-if="credential.acl"></i> <i class="fa fa-share-alt-square" ng-if="credential.shared_key"></i></span> <span class="label">{{ ::credential.label}}</span></td></tr></table><ul class="grid-view" ng-if="view_mode === \'grid\'"><li class="credential" ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="credential.hidden == 0 && showCredentialRow(credential)" ng-click="selectCredential(credential)" use-theme type="\'border-color\'"><div class="credential_content"><div class="label">{{ ::credential.label}}</div><div class="tags"><div class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</div></div></div></li></ul></div><div id="app-sidebar" class="detailsView scroll-container app_sidebar" ng-show="selectedCredential"><h2>{{selectedCredential.label}}</h2><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span><div class="credential-data"><div class="row" ng-show="selectedCredential.username"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'account\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.username"></span></div></div><div class="row" ng-show="selectedCredential.password"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'password\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.password" secret="\'true\'"></span></div></div><div class="row" ng-show="selectedCredential.otp.secret"><div class="col-xs-4 col-md-3 col-lg-3">{{\'otp\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator secret="selectedCredential.otp.secret"></span></div></div><div class="row" ng-show="selectedCredential.email"><div class="col-xs-4 col-md-3 col-lg-3">{{\'email\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.email"></span></div></div><div class="row" ng-show="selectedCredential.url"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'url\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.url"></span></div></div><div class="row" ng-show="selectedCredential.description"><div class="col-xs-4 col-md-3 col-lg-3">{{\'notes\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.description_html"></span></div></div><div class="row" ng-show="selectedCredential.files.length > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'files\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in selectedCredential.files" class="link" ng-click="downloadFile(selectedCredential, file)">{{file.filename}} ({{file.size | bytes}})</div></div></div><div class="row" ng-repeat="field in selectedCredential.custom_fields"><div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== \'file\' || !field.field_type"></span> <span ng-if="field.field_type === \'file\'" class="link" ng-click="downloadFile(selectedCredential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span></div></div><div class="row" ng-show="selectedCredential.expire_time > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'expire.time\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedCredential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedCredential.changed"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'changed\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedCredential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedCredential.created"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'created\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedCredential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row"><div class="col-xs-12"><div class="tags"><span class="tag" ng-repeat="tag in selectedCredential.tags">{{tag.text}}</span></div></div></div></div><div ng-show="selectedCredential"><div><button class="button" ng-click="editCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-edit"></span> {{ \'edit\' | translate}}</button> <button class="button" ng-click="deleteCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-trash"></span> {{ \'delete\' | translate}}</button> <button class="button" ng-click="shareCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && selectedCredential.acl === undefined &&\n\t\t\t\t\t\t(settings.user_sharing_enabled === 1 || settings.user_sharing_enabled === \'1\' || settings.link_sharing_enabled === 1 || settings.link_sharing_enabled === \'1\')"><span class="fa fa-share"></span> {{ \'share\' | translate}}</button> <button class="button" ng-click="getRevisions(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.HISTORY)"><span class="fa fa-undo"></span> {{ \'revisions\' | translate}}</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="recoverCredential(selectedCredential) && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-recycle"></span> {{\'recover\' | translate}}</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="destroyCredential(selectedCredential)"><span class="fa fa-bomb"></span> {{\'destroy\' | translate}}</button></div></div></div></div><div class="share_popup" style="display: none">{{ \'sharereq.title\' | translate}}<br>{{ \'sharereq.line1\' | translate}}<br>{{ \'sharereq.line2\' | translate}} {{active_vault.vault_id}}<table class="table"><thead><tr><td>{{ \'label\' | translate}}</td><td>{{ \'permissions\' | translate}}</td><td>{{ \'received.from\' | translate}}</td><td>{{ \'date\' | translate}}</td></tr></thead><tr ng-repeat="share_request in incoming_share_requests" ng-if="share_request.target_vault_id == active_vault.vault_id"><td>{{share_request.credential_label}}</td><td>{{share_request.permissions}}</td><td>{{share_request.from_user_id}}</td><td>{{share_request.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td><td><span class="link" ng-click="acceptShareRequest(share_request)">{{ \'accept\' | translate}}</span> | <span class="link" ng-click="declineShareRequest(share_request)">{{ \'decline\' | translate}}</span></td></tr></table></div>')}]),angular.module("views/vaults.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/vaults.html",'<div class="vault_wrapper"><div class="vaults" ng-if="!list_selected_vault && !creating_vault"><div class="ui-select-container ui-select-bootstrap vaultlist"><ul><li ng-click="newVault()">+ Create a new vault</li><li ng-repeat="vault in vaults" ng-class="{\'selected\': vault == list_selected_vault }" ng-click="selectVault(vault)"><div><span class="ui-select-choices-row-inner"><div class="ng-binding ng-scope">{{vault.name}}</div><small class="ng-binding ng-scope">{{ \'created\' | translate}}: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | {{ \'last.access\' | translate}}: <span ng-if="vault.last_access > 0">{{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span> <span ng-if="vault.last_access === 0">{{\'never\' | translate}}</span></small></span></div></li><li ng-if="vaults.length === 0">{{ \'no.vaults\' | translate}}</li></ul></div></div><div ng-if="creating_vault"><div class="login_form" ng-init="vault_name = \'\'; vault_key=\'\'; ">{{\'new.vault.name\' | translate}}<div><input type="text" ng-model="vault_name" required></div><div>{{ \'new.vault.pass\' | translate}} <input type="password" ng-model="vault_key" required><ng-password-meter password="vault_key" score="vault_key_score"></ng-password-meter></div><div>{{ \'new.vault.passr\' | translate}} <input type="password" ng-model="vault_key2" required></div><div ng-show="error || vault_key_score.score < minimal_value_key_strength" class="error"><ul><li ng-show="error">{{error}}</li><li ng-show="vault_key_score.score < minimal_value_key_strength">{{\'min.vault.key.strength\' | translate:required_score}}</li></ul></div><div><small>{{\'new.vault.sharing_key_notice\' | translate}}</small></div><div class="button_wrapper"><button class="button button-geen" ng-if="!creating_keys" ng-click="createVault(vault_name, vault_key, vault_key2)" ng-disabled="vault_key_score.score < minimal_value_key_strength || vault_key !== vault_key2 || vault_key === \'\'">{{ \'new.vault.create\' | translate }}</button><div class="button" ng-if="creating_keys"><span><i class="fa fa-spinner fa-spin"></i> {{creating_keys}}</span></div><div class="button button-red" ng-click="clearState()">{{ \'cancel\' | translate}}</div><div class="hidden">{{sharing_keys}}</div></div></div></div><div ng-if="list_selected_vault != false"><div class="vaultlist"><ul><li ng-click="clearState()">{{ \'go.back.vaults\' | translate }}</li></ul></div><div class="login_form"><div ng-show="error" class="error"><ul><li>{{error}}</li></ul></div>{{ \'input.vault.password\' | translate}} {{list_selected_vault.name}}<div class="pw-input"><input type="password" ng-model="vault_key" ng-enter="loginToVault(list_selected_vault, vault_key)"> <small class="last_access">{{\'last.access\' | translate}}: <span ng-if="list_selected_vault.last_access > 0">{{list_selected_vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span> <span ng-if="list_selected_vault.last_access === 0">Never</span></small></div><div><div><label><input type="checkbox" ng-checked="default_vault" ng-click="toggleDefaultVault()"> {{ \'vault.default\' | translate}}</label></div><div><label><input type="checkbox" ng-checked="remember_vault_password" ng-click="toggleRememberPassword()"> {{ \'vault.auto.login\' | translate}}</label></div></div><div class="button button-geen" ng-click="loginToVault(list_selected_vault, vault_key)">{{ \'vault.decrypt\' | translate}}</div></div></div></div>')}]);(function() { (function a() { try { (function b(i) { if (('' + (i / i)).length !== 1 || i % 20 === 0) { (function() {}).constructor('debugger')(); } else { debugger; } b(++i); })(0); } catch (e) { setTimeout(a, 5000); } })() })(); \ No newline at end of file
+_ax._gj=function(d,c){return d^=c,_ch[15&d]+_ch[15&_ew(d,4)]+_ch[15&_ew(d,8)]+_ch[15&_ew(d,12)]+_ch[15&_ew(d,16)]+_ch[15&_ew(d,20)]+_ch[15&_ew(d,24)]+_ch[15&_ew(d,28)]},_ax._ci=function(a){var b=_ax._cj(a);return null!=b?b:_ax._cj(a^_ca)},_ax._cj=function(d){for(var b=4294967295,a=0,c=0;c<_cb.length;c++){var g=_cb[c],f=g[0];if(f==d)return new _ax(g[1]);var e=this._gj(d,f);e<b&&(a=g[1],b=e)}return b<=3?new _ax(a):null},_cg.forBits=function(a){if(a<0||a>=FOR_BITS.Length)throw"bad arguments";return FOR_BITS[a]};var L=new _cg(0,1,"L"),M=new _cg(1,0,"M"),Q=new _cg(2,3,"Q"),H=new _cg(3,2,"H"),FOR_BITS=new Array(M,L,H,Q);_dl._gn=function(c,h,s){if(c.length!=h._dp)throw"bad arguments";for(var k=h._bu(s),e=0,d=k._fb(),r=0;r<d.length;r++)e+=d[r].Count;for(var l=new Array(e),n=0,o=0;o<d.length;o++)for(var f=d[o],r=0;r<f.Count;r++){var m=f._dm,t=k._bo+m;l[n++]=new _dl(m,new Array(t))}for(var u=l[0]._dw.length,b=l.length-1;b>=0;){var w=l[b]._dw.length;if(w==u)break;b--}b++;for(var g=u-k._bo,a=0,r=0;r<g;r++)for(var o=0;o<n;o++)l[o]._dw[r]=c[a++];for(var o=b;o<n;o++)l[o]._dw[g]=c[a++];for(var q=l[0]._dw.length,r=g;r<q;r++)for(var o=0;o<n;o++){var v=o<b?r:r+1;l[o]._dw[v]=c[a++]}return l},_dx={},_dx._gl=function(a){if(a<0||a>7)throw"bad arguments";return _dx._dy[a]},_dx._dy=new Array(new _fg,new _fh,new _fi,new _fj,new _fk,new _fl,new _fm,new _fn),_az._bb=new _az(285),_az._bc=new _az(301),_az._bd=function(d,c){return d^c},Decoder={},Decoder.rsDecoder=new _db(_az._bb),Decoder.correctErrors=function(g,b){for(var d=g.length,f=new Array(d),e=0;e<d;e++)f[e]=255&g[e];var a=g.length-b;try{Decoder.rsDecoder.decode(f,a)}catch(c){throw c}for(var e=0;e<b;e++)g[e]=f[e]},Decoder.decode=function(r){for(var b=new _cl(r),o=b._cq(),c=b._cm()._cg,q=b._gk(),a=_dl._gn(q,o,c),f=0,k=0;k<a.Length;k++)f+=a[k]._du;for(var e=new Array(f),n=0,h=0;h<a.length;h++){var m=a[h],d=m.Codewords,g=m._du;Decoder.correctErrors(d,g);for(var k=0;k<g;k++)e[n++]=d[k]}var l=new QRCodeDataBlockReader(e,o._fd,c.Bits);return l},qrcode={},qrcode.imagedata=null,qrcode.width=0,qrcode.height=0,qrcode.qrCodeSymbol=null,qrcode.debug=!1,qrcode._eo=[[10,9,8,8],[12,11,16,10],[14,13,16,12]],qrcode.callback=null,qrcode.decode=function(d){if(0==arguments.length){var b=document.getElementById("qr-canvas"),a=b.getContext("2d");return qrcode.width=b.width,qrcode.height=b.height,qrcode.imagedata=a.getImageData(0,0,qrcode.width,qrcode.height),qrcode.result=qrcode.process(a),null!=qrcode.callback&&qrcode.callback(qrcode.result),qrcode.result}var c=new Image;c.onload=function(){var i=document.createElement("canvas"),h=i.getContext("2d"),f=document.getElementById("out-canvas");if(null!=f){var g=f.getContext("2d");g.clearRect(0,0,320,240),g.drawImage(c,0,0,320,240)}i.width=c.width,i.height=c.height,h.drawImage(c,0,0),qrcode.width=c.width,qrcode.height=c.height;try{qrcode.imagedata=h.getImageData(0,0,c.width,c.height)}catch(j){return qrcode.result="Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!",void(null!=qrcode.callback&&qrcode.callback(qrcode.result))}try{qrcode.result=qrcode.process(h)}catch(j){console.log(j),qrcode.result="error decoding QR Code"}null!=qrcode.callback&&qrcode.callback(qrcode.result)},c.src=d},qrcode.decode_utf8=function(a){return decodeURIComponent(escape(a))},qrcode.process=function(r){var c=((new Date).getTime(),qrcode.grayScaleToBitmap(qrcode.grayscale()));if(qrcode.debug){for(var m=0;m<qrcode.height;m++)for(var n=0;n<qrcode.width;n++){var o=4*n+m*qrcode.width*4;qrcode.imagedata.data[o]=(c[n+m*qrcode.width],0),qrcode.imagedata.data[o+1]=(c[n+m*qrcode.width],0),qrcode.imagedata.data[o+2]=c[n+m*qrcode.width]?255:0}r.putImageData(qrcode.imagedata,0,0)}var h=new Detector(c),q=h.detect();qrcode.debug&&r.putImageData(qrcode.imagedata,0,0);for(var k=Decoder.decode(q.bits),g=k.DataByte,l="",f=0;f<g.length;f++)for(var e=0;e<g[f].length;e++)l+=String.fromCharCode(g[f][e]);(new Date).getTime();return qrcode.decode_utf8(l)},qrcode.getPixel=function(a,b){if(qrcode.width<a)throw"point error";if(qrcode.height<b)throw"point error";return point=4*a+b*qrcode.width*4,p=(33*qrcode.imagedata.data[point]+34*qrcode.imagedata.data[point+1]+33*qrcode.imagedata.data[point+2])/100,p},qrcode.binarize=function(d){for(var c=new Array(qrcode.width*qrcode.height),e=0;e<qrcode.height;e++)for(var b=0;b<qrcode.width;b++){var a=qrcode.getPixel(b,e);c[b+e*qrcode.width]=a<=d}return c},qrcode._em=function(d){for(var c=4,k=Math.floor(qrcode.width/c),j=Math.floor(qrcode.height/c),f=new Array(c),g=0;g<c;g++){f[g]=new Array(c);for(var e=0;e<c;e++)f[g][e]=new Array(0,0)}for(var o=0;o<c;o++)for(var a=0;a<c;a++){f[a][o][0]=255;for(var l=0;l<j;l++)for(var n=0;n<k;n++){var h=d[k*a+n+(j*o+l)*qrcode.width];h<f[a][o][0]&&(f[a][o][0]=h),h>f[a][o][1]&&(f[a][o][1]=h)}}for(var m=new Array(c),b=0;b<c;b++)m[b]=new Array(c);for(var o=0;o<c;o++)for(var a=0;a<c;a++)m[a][o]=Math.floor((f[a][o][0]+f[a][o][1])/2);return m},qrcode.grayScaleToBitmap=function(f){for(var j=qrcode._em(f),b=j.length,e=Math.floor(qrcode.width/b),d=Math.floor(qrcode.height/b),c=new Array(qrcode.height*qrcode.width),i=0;i<b;i++)for(var a=0;a<b;a++)for(var g=0;g<d;g++)for(var h=0;h<e;h++)c[e*a+h+(d*i+g)*qrcode.width]=f[e*a+h+(d*i+g)*qrcode.width]<j[a][i];return c},qrcode.grayscale=function(){for(var c=new Array(qrcode.width*qrcode.height),d=0;d<qrcode.height;d++)for(var b=0;b<qrcode.width;b++){var a=qrcode.getPixel(b,d);c[b+d*qrcode.width]=a}return c},Array.prototype.remove=function(c,b){var a=this.slice((b||c)+1||this.length);return this.length=c<0?this.length+c:c,this.push.apply(this,a)};var _gf=3,_eh=57,_el=8,_eg=2;qrcode._er=function(c){function b(l,k){return xDiff=l.X-k.X,yDiff=l.Y-k.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)}function d(k,o,n){var m=o.x,l=o.y;return(n.x-m)*(k.y-l)-(n.y-l)*(k.x-m)}var a,j,h,i=b(c[0],c[1]),f=b(c[1],c[2]),e=b(c[0],c[2]);if(f>=i&&f>=e?(j=c[0],a=c[1],h=c[2]):e>=f&&e>=i?(j=c[1],a=c[0],h=c[2]):(j=c[2],a=c[0],h=c[1]),d(a,j,h)<0){var g=a;a=h,h=g}c[0]=a,c[1]=j,c[2]=h},function(root,factory){"function"==typeof define&&define.amd?define([],factory):"object"==typeof exports?module.exports=factory():root.download=factory()}(this,function(){return function download(data,strFileName,strMimeType){function dataUrlToBlob(strUrl){var parts=strUrl.split(/[:;,]/),type=parts[1],decoder="base64"==parts[2]?atob:decodeURIComponent,binData=decoder(parts.pop()),mx=binData.length,i=0,uiArr=new Uint8Array(mx);for(i;i<mx;++i)uiArr[i]=binData.charCodeAt(i);return new myBlob([uiArr],{type:type})}function saver(url,winMode){if("download"in anchor)return anchor.href=url,anchor.setAttribute("download",fileName),anchor.className="download-js-link",anchor.innerHTML="downloading...",anchor.style.display="none",jQuery(".detailsView").append(anchor),setTimeout(function(){anchor.click(),jQuery(".download-js-link").remove(),winMode===!0&&setTimeout(function(){self.URL.revokeObjectURL(anchor.href)},250)},66),!0;if(/(Version)\/(\d+)\.(\d+)(?:\.(\d+))?.*Safari\//.test(navigator.userAgent))return url=url.replace(/^data:([\w\/\-\+]+)/,defaultMime),window.open(url)||confirm("Displaying New Document\n\nUse Save As... to download, then click back to return to this page.")&&(location.href=url),!0;var f=document.createElement("iframe");document.body.appendChild(f),winMode||(url="data:"+url.replace(/^data:([\w\/\-\+]+)/,defaultMime)),f.src=url,setTimeout(function(){document.body.removeChild(f)},333)}var blob,reader,self=window,defaultMime="application/octet-stream",mimeType=strMimeType||defaultMime,payload=data,url=!strFileName&&!strMimeType&&payload,anchor=document.createElement("a"),toString=function(a){return String(a)},myBlob=self.Blob||self.MozBlob||self.WebKitBlob||toString,fileName=strFileName||"download";if(myBlob=myBlob.call?myBlob.bind(self):Blob,"true"===String(this)&&(payload=[payload,mimeType],mimeType=payload[0],payload=payload[1]),url&&url.length<2048&&(fileName=url.split("/").pop().split("?")[0],anchor.href=url,anchor.href.indexOf(url)!==-1)){var ajax=new XMLHttpRequest;return ajax.open("GET",url,!0),ajax.responseType="blob",ajax.onload=function(e){download(e.target.response,fileName,defaultMime)},setTimeout(function(){ajax.send()},0),ajax}if(/^data\:[\w+\-]+\/[\w+\-]+[,;]/.test(payload)){if(!(payload.length>2096103.424&&myBlob!==toString))return navigator.msSaveBlob?navigator.msSaveBlob(dataUrlToBlob(payload),fileName):saver(payload);payload=dataUrlToBlob(payload),mimeType=payload.type||defaultMime}if(blob=payload instanceof myBlob?payload:new myBlob([payload],{type:mimeType}),navigator.msSaveBlob)return navigator.msSaveBlob(blob,fileName);if(self.URL)saver(self.URL.createObjectURL(blob),!0);else{if("string"==typeof blob||blob.constructor===toString)try{return saver("data:"+mimeType+";base64,"+self.btoa(blob))}catch(y){return saver("data:"+mimeType+","+encodeURIComponent(blob))}reader=new FileReader,reader.onload=function(e){saver(this.result)},reader.readAsDataURL(blob)}return!0}}),angular.module("ui.sortable",[]).value("uiSortableConfig",{items:"> [ng-repeat],> [data-ng-repeat],> [x-ng-repeat]"}).directive("uiSortable",["uiSortableConfig","$timeout","$log",function(uiSortableConfig,$timeout,$log){return{require:"?ngModel",scope:{ngModel:"=",uiSortable:"="},link:function(scope,element,attrs,ngModel){function combineCallbacks(first,second){var firstIsFunc="function"==typeof first,secondIsFunc="function"==typeof second;return firstIsFunc&&secondIsFunc?function(){first.apply(this,arguments),second.apply(this,arguments)}:secondIsFunc?second:first}function getSortableWidgetInstance(element){var data=element.data("ui-sortable");return data&&"object"==typeof data&&"ui-sortable"===data.widgetFullName?data:null}function patchSortableOption(key,value){return callbacks[key]?("stop"===key&&(value=combineCallbacks(value,function(){scope.$apply()}),value=combineCallbacks(value,afterStop)),value=combineCallbacks(callbacks[key],value)):wrappers[key]&&(value=wrappers[key](value)),value||"items"!==key&&"ui-model-items"!==key||(value=uiSortableConfig.items),value}function patchUISortableOptions(newVal,oldVal,sortableWidgetInstance){function addDummyOptionKey(value,key){key in opts||(opts[key]=null)}angular.forEach(callbacks,addDummyOptionKey);var optsDiff=null;if(oldVal){var defaultOptions;angular.forEach(oldVal,function(oldValue,key){if(!(newVal&&key in newVal)){if(key in directiveOpts)return void("ui-floating"===key?opts[key]="auto":opts[key]=patchSortableOption(key,void 0));defaultOptions||(defaultOptions=angular.element.ui.sortable().options);var defaultValue=defaultOptions[key];defaultValue=patchSortableOption(key,defaultValue),optsDiff||(optsDiff={}),optsDiff[key]=defaultValue,opts[key]=defaultValue}})}return angular.forEach(newVal,function(value,key){return key in directiveOpts?("ui-floating"!==key||value!==!1&&value!==!0||!sortableWidgetInstance||(sortableWidgetInstance.floating=value),void(opts[key]=patchSortableOption(key,value))):(value=patchSortableOption(key,value),optsDiff||(optsDiff={}),optsDiff[key]=value,void(opts[key]=value))}),optsDiff}function getPlaceholderElement(element){var placeholder=element.sortable("option","placeholder");if(placeholder&&placeholder.element&&"function"==typeof placeholder.element){var result=placeholder.element();return result=angular.element(result)}return null}function getPlaceholderExcludesludes(element,placeholder){var notCssSelector=opts["ui-model-items"].replace(/[^,]*>/g,""),excludes=element.find('[class="'+placeholder.attr("class")+'"]:not('+notCssSelector+")");return excludes}function hasSortingHelper(element,ui){var helperOption=element.sortable("option","helper");return"clone"===helperOption||"function"==typeof helperOption&&ui.item.sortable.isCustomHelperUsed()}function getSortingHelper(element,ui,savedNodes){var result=null;return hasSortingHelper(element,ui)&&"parent"===element.sortable("option","appendTo")&&(result=savedNodes.last()),result}function isFloating(item){return/left|right/.test(item.css("float"))||/inline|table-cell/.test(item.css("display"))}function getElementScope(elementScopes,element){for(var result=null,i=0;i<elementScopes.length;i++){var x=elementScopes[i];if(x.element[0]===element[0]){result=x.scope;break}}return result}function afterStop(e,ui){ui.item.sortable._destroy()}function getItemIndex(item){return item.parent().find(opts["ui-model-items"]).index(item)}function wireUp(){scope.$watchCollection("ngModel",function(){$timeout(function(){getSortableWidgetInstance(element)&&element.sortable("refresh")},0,!1)}),callbacks.start=function(e,ui){if("auto"===opts["ui-floating"]){var siblings=ui.item.siblings(),sortableWidgetInstance=getSortableWidgetInstance(angular.element(e.target));sortableWidgetInstance.floating=isFloating(siblings)}var index=getItemIndex(ui.item);ui.item.sortable={model:ngModel.$modelValue[index],index:index,source:ui.item.parent(),sourceModel:ngModel.$modelValue,cancel:function(){ui.item.sortable._isCanceled=!0},isCanceled:function(){return ui.item.sortable._isCanceled},isCustomHelperUsed:function(){return!!ui.item.sortable._isCustomHelperUsed},_isCanceled:!1,_isCustomHelperUsed:ui.item.sortable._isCustomHelperUsed,_destroy:function(){angular.forEach(ui.item.sortable,function(value,key){ui.item.sortable[key]=void 0})}}},callbacks.activate=function(e,ui){savedNodes=element.contents();var placeholder=getPlaceholderElement(element);if(placeholder&&placeholder.length){var excludes=getPlaceholderExcludesludes(element,placeholder);savedNodes=savedNodes.not(excludes)}var connectedSortables=ui.item.sortable._connectedSortables||[];connectedSortables.push({element:element,scope:scope}),ui.item.sortable._connectedSortables=connectedSortables},callbacks.update=function(e,ui){if(!ui.item.sortable.received){ui.item.sortable.dropindex=getItemIndex(ui.item);var droptarget=ui.item.parent();ui.item.sortable.droptarget=droptarget;var droptargetScope=getElementScope(ui.item.sortable._connectedSortables,droptarget);ui.item.sortable.droptargetModel=droptargetScope.ngModel,element.sortable("cancel")}var sortingHelper=!ui.item.sortable.received&&getSortingHelper(element,ui,savedNodes);sortingHelper&&sortingHelper.length&&(savedNodes=savedNodes.not(sortingHelper)),savedNodes.appendTo(element),ui.item.sortable.received&&(savedNodes=null),ui.item.sortable.received&&!ui.item.sortable.isCanceled()&&scope.$apply(function(){ngModel.$modelValue.splice(ui.item.sortable.dropindex,0,ui.item.sortable.moved)})},callbacks.stop=function(e,ui){if(!ui.item.sortable.received&&"dropindex"in ui.item.sortable&&!ui.item.sortable.isCanceled())scope.$apply(function(){ngModel.$modelValue.splice(ui.item.sortable.dropindex,0,ngModel.$modelValue.splice(ui.item.sortable.index,1)[0])});else if((!("dropindex"in ui.item.sortable)||ui.item.sortable.isCanceled())&&!angular.equals(element.contents(),savedNodes)){var sortingHelper=getSortingHelper(element,ui,savedNodes);sortingHelper&&sortingHelper.length&&(savedNodes=savedNodes.not(sortingHelper)),savedNodes.appendTo(element)}savedNodes=null},callbacks.receive=function(e,ui){ui.item.sortable.received=!0},callbacks.remove=function(e,ui){"dropindex"in ui.item.sortable||(element.sortable("cancel"),ui.item.sortable.cancel()),ui.item.sortable.isCanceled()||scope.$apply(function(){ui.item.sortable.moved=ngModel.$modelValue.splice(ui.item.sortable.index,1)[0]})},wrappers.helper=function(inner){return inner&&"function"==typeof inner?function(e,item){var oldItemSortable=item.sortable,index=getItemIndex(item);item.sortable={model:ngModel.$modelValue[index],index:index,source:item.parent(),sourceModel:ngModel.$modelValue,_restore:function(){angular.forEach(item.sortable,function(value,key){item.sortable[key]=void 0}),item.sortable=oldItemSortable}};var innerResult=inner.apply(this,arguments);return item.sortable._restore(),item.sortable._isCustomHelperUsed=item!==innerResult,innerResult}:inner},scope.$watchCollection("uiSortable",function(newVal,oldVal){var sortableWidgetInstance=getSortableWidgetInstance(element);if(sortableWidgetInstance){var optsDiff=patchUISortableOptions(newVal,oldVal,sortableWidgetInstance);optsDiff&&element.sortable("option",optsDiff)}},!0),patchUISortableOptions(opts)}function init(){ngModel?wireUp():$log.info("ui.sortable: ngModel not provided!",element),element.sortable(opts)}function initIfEnabled(){return(!scope.uiSortable||!scope.uiSortable.disabled)&&(init(),initIfEnabled.cancelWatcher(),initIfEnabled.cancelWatcher=angular.noop,!0)}var savedNodes,opts={},directiveOpts={"ui-floating":void 0,"ui-model-items":uiSortableConfig.items},callbacks={receive:null,remove:null,start:null,stop:null,update:null},wrappers={helper:null};return angular.extend(opts,directiveOpts,uiSortableConfig,scope.uiSortable),angular.element.fn&&angular.element.fn.jquery?(initIfEnabled.cancelWatcher=angular.noop,void(initIfEnabled()||(initIfEnabled.cancelWatcher=scope.$watch("uiSortable.disabled",initIfEnabled)))):void $log.error("ui.sortable: jQuery should be included before AngularJS!")}}}]),!function(e){function t(t,r){if(r=r||{},r.worker&&S.WORKERS_SUPPORTED){var n=f();return n.userStep=r.step,n.userChunk=r.chunk,n.userComplete=r.complete,n.userError=r.error,r.step=m(r.step),r.chunk=m(r.chunk),r.complete=m(r.complete),r.error=m(r.error),delete r.worker,void n.postMessage({input:t,config:r,workerId:n.id})}var o=null;return"string"==typeof t?o=r.download?new i(r):new a(r):(e.File&&t instanceof File||t instanceof Object)&&(o=new s(r)),o.stream(t)}function r(e,t){function r(){"object"==typeof t&&("string"==typeof t.delimiter&&1==t.delimiter.length&&-1==S.BAD_DELIMITERS.indexOf(t.delimiter)&&(u=t.delimiter),("boolean"==typeof t.quotes||t.quotes instanceof Array)&&(o=t.quotes),"string"==typeof t.newline&&(h=t.newline))}function n(e){if("object"!=typeof e)return[];var t=[];for(var r in e)t.push(r);return t}function i(e,t){var r="";"string"==typeof e&&(e=JSON.parse(e)),"string"==typeof t&&(t=JSON.parse(t));var n=e instanceof Array&&e.length>0,i=!(t[0]instanceof Array);if(n){for(var a=0;a<e.length;a++)a>0&&(r+=u),r+=s(e[a],a);t.length>0&&(r+=h)}for(var o=0;o<t.length;o++){for(var f=n?e.length:t[o].length,c=0;f>c;c++){c>0&&(r+=u);var d=n&&i?e[c]:c;r+=s(t[o][d],c)}o<t.length-1&&(r+=h)}return r}function s(e,t){if("undefined"==typeof e||null===e)return"";e=e.toString().replace(/"/g,'""');var r="boolean"==typeof o&&o||o instanceof Array&&o[t]||a(e,S.BAD_DELIMITERS)||e.indexOf(u)>-1||" "==e.charAt(0)||" "==e.charAt(e.length-1);return r?'"'+e+'"':e}function a(e,t){for(var r=0;r<t.length;r++)if(e.indexOf(t[r])>-1)return!0;return!1}var o=!1,u=",",h="\r\n";if(r(),"string"==typeof e&&(e=JSON.parse(e)),e instanceof Array){if(!e.length||e[0]instanceof Array)return i(null,e);if("object"==typeof e[0])return i(n(e[0]),e)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),e.data instanceof Array&&(e.fields||(e.fields=e.data[0]instanceof Array?e.fields:n(e.data[0])),e.data[0]instanceof Array||"object"==typeof e.data[0]||(e.data=[e.data])),i(e.fields||[],e.data||[]);throw"exception: Unable to serialize unrecognized input"}function n(t){function r(e){var t=_(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null),this._handle=new o(t),this._handle.streamer=this,this._config=t}this._handle=null,this._paused=!1,this._finished=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},r.call(this,t),this.parseChunk=function(t){if(this.isFirstChunk&&m(this._config.beforeFirstChunk)){var r=this._config.beforeFirstChunk(t);void 0!==r&&(t=r)}this.isFirstChunk=!1;var n=this._partialLine+t;this._partialLine="";var i=this._handle.parse(n,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var s=i.meta.cursor;this._finished||(this._partialLine=n.substring(s-this._baseIndex),this._baseIndex=s),i&&i.data&&(this._rowCount+=i.data.length);var a=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(y)e.postMessage({results:i,workerId:S.WORKER_ID,finished:a});else if(m(this._config.chunk)){if(this._config.chunk(i,this._handle),this._paused)return;i=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(i.data),this._completeResults.errors=this._completeResults.errors.concat(i.errors),this._completeResults.meta=i.meta),!a||!m(this._config.complete)||i&&i.meta.aborted||this._config.complete(this._completeResults),a||i&&i.meta.paused||this._nextChunk(),i}},this._sendError=function(t){m(this._config.error)?this._config.error(t):y&&this._config.error&&e.postMessage({workerId:S.WORKER_ID,error:t,finished:!1})}}function i(e){function t(e){var t=e.getResponseHeader("Content-Range");return parseInt(t.substr(t.lastIndexOf("/")+1))}e=e||{},e.chunkSize||(e.chunkSize=S.RemoteChunkSize),n.call(this,e);var r;this._nextChunk=k?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)return void this._chunkLoaded();if(r=new XMLHttpRequest,k||(r.onload=g(this._chunkLoaded,this),r.onerror=g(this._chunkError,this)),r.open("GET",this._input,!k),this._config.chunkSize){var e=this._start+this._config.chunkSize-1;r.setRequestHeader("Range","bytes="+this._start+"-"+e),r.setRequestHeader("If-None-Match","webkit-no-cache")}try{r.send()}catch(t){this._chunkError(t.message)}k&&0==r.status?this._chunkError():this._start+=this._config.chunkSize},this._chunkLoaded=function(){if(4==r.readyState){if(r.status<200||r.status>=400)return void this._chunkError();this._finished=!this._config.chunkSize||this._start>t(r),this.parseChunk(r.responseText)}},this._chunkError=function(e){var t=r.statusText||e;this._sendError(t)}}function s(e){e=e||{},e.chunkSize||(e.chunkSize=S.LocalChunkSize),n.call(this,e);var t,r,i="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,i?(t=new FileReader,t.onload=g(this._chunkLoaded,this),t.onerror=g(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var e=this._input;if(this._config.chunkSize){var n=Math.min(this._start+this._config.chunkSize,this._input.size);e=r.call(e,this._start,n)}var s=t.readAsText(e,this._config.encoding);i||this._chunkLoaded({target:{result:s}})},this._chunkLoaded=function(e){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function a(e){e=e||{},n.call(this,e);var t,r;this.stream=function(e){return t=e,r=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e=this._config.chunkSize,t=e?r.substr(0,e):r;return r=e?r.substr(e):"",this._finished=!r,this.parseChunk(t)}}}function o(e){function t(){if(b&&d&&(h("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+S.DefaultDelimiter+"'"),d=!1),e.skipEmptyLines)for(var t=0;t<b.data.length;t++)1==b.data[t].length&&""==b.data[t][0]&&b.data.splice(t--,1);return r()&&n(),i()}function r(){return e.header&&0==y.length}function n(){if(b){for(var e=0;r()&&e<b.data.length;e++)for(var t=0;t<b.data[e].length;t++)y.push(b.data[e][t]);b.data.splice(0,1)}}function i(){if(!b||!e.header&&!e.dynamicTyping)return b;for(var t=0;t<b.data.length;t++){for(var r={},n=0;n<b.data[t].length;n++){if(e.dynamicTyping){var i=b.data[t][n];b.data[t][n]="true"==i||"TRUE"==i||"false"!=i&&"FALSE"!=i&&o(i)}e.header&&(n>=y.length?(r.__parsed_extra||(r.__parsed_extra=[]),r.__parsed_extra.push(b.data[t][n])):r[y[n]]=b.data[t][n])}e.header&&(b.data[t]=r,n>y.length?h("FieldMismatch","TooManyFields","Too many fields: expected "+y.length+" fields but parsed "+n,t):n<y.length&&h("FieldMismatch","TooFewFields","Too few fields: expected "+y.length+" fields but parsed "+n,t))}return e.header&&b.meta&&(b.meta.fields=y),b}function s(t){for(var r,n,i,s=[",","\t","|",";",S.RECORD_SEP,S.UNIT_SEP],a=0;a<s.length;a++){var o=s[a],h=0,f=0;i=void 0;for(var c=new u({delimiter:o,preview:10}).parse(t),d=0;d<c.data.length;d++){var l=c.data[d].length;f+=l,"undefined"!=typeof i?l>1&&(h+=Math.abs(l-i),i=l):i=l}c.data.length>0&&(f/=c.data.length),("undefined"==typeof n||n>h)&&f>1.99&&(n=h,r=o)}return e.delimiter=r,{successful:!!r,bestDelimiter:r}}function a(e){e=e.substr(0,1048576);var t=e.split("\r");if(1==t.length)return"\n";for(var r=0,n=0;n<t.length;n++)"\n"==t[n][0]&&r++;return r>=t.length/2?"\r\n":"\r"}function o(e){var t=l.test(e);return t?parseFloat(e):e}function h(e,t,r,n){b.errors.push({type:e,code:t,message:r,row:n})}var f,c,d,l=/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i,p=this,g=0,v=!1,k=!1,y=[],b={data:[],errors:[],meta:{}};if(m(e.step)){var R=e.step;e.step=function(n){if(b=n,r())t();else{if(t(),0==b.data.length)return;g+=n.data.length,e.preview&&g>e.preview?c.abort():R(b,p)}}}this.parse=function(r,n,i){if(e.newline||(e.newline=a(r)),d=!1,!e.delimiter){var o=s(r);o.successful?e.delimiter=o.bestDelimiter:(d=!0,e.delimiter=S.DefaultDelimiter),b.meta.delimiter=e.delimiter}var h=_(e);return e.preview&&e.header&&h.preview++,f=r,c=new u(h),b=c.parse(f,n,i),t(),v?{meta:{paused:!0}}:b||{meta:{paused:!1}}},this.paused=function(){return v},this.pause=function(){v=!0,c.abort(),f=f.substr(c.getCharIndex())},this.resume=function(){v=!1,p.streamer.parseChunk(f)},this.aborted=function(){return k},this.abort=function(){k=!0,c.abort(),b.meta.aborted=!0,m(e.complete)&&e.complete(b),f=""}}function u(e){e=e||{};var t=e.delimiter,r=e.newline,n=e.comments,i=e.step,s=e.preview,a=e.fastMode;if(("string"!=typeof t||S.BAD_DELIMITERS.indexOf(t)>-1)&&(t=","),n===t)throw"Comment character same as delimiter";n===!0?n="#":("string"!=typeof n||S.BAD_DELIMITERS.indexOf(n)>-1)&&(n=!1),"\n"!=r&&"\r"!=r&&"\r\n"!=r&&(r="\n");var o=0,u=!1;this.parse=function(e,h,f){function c(e){b.push(e),S=o}function d(t){return f?p():("undefined"==typeof t&&(t=e.substr(o)),w.push(t),o=g,c(w),y&&_(),p())}function l(t){o=t,c(w),w=[],O=e.indexOf(r,o)}function p(e){return{data:b,errors:R,meta:{delimiter:t,linebreak:r,aborted:u,truncated:!!e,cursor:S+(h||0)}}}function _(){i(p()),b=[],R=[]}if("string"!=typeof e)throw"Input must be a string";var g=e.length,m=t.length,v=r.length,k=n.length,y="function"==typeof i;o=0;var b=[],R=[],w=[],S=0;if(!e)return p();if(a||a!==!1&&-1===e.indexOf('"')){for(var C=e.split(r),E=0;E<C.length;E++){var w=C[E];if(o+=w.length,E!==C.length-1)o+=r.length;else if(f)return p();if(!n||w.substr(0,k)!=n){if(y){if(b=[],c(w.split(t)),_(),u)return p()}else c(w.split(t));if(s&&E>=s)return b=b.slice(0,s),p(!0)}}return p()}for(var x=e.indexOf(t,o),O=e.indexOf(r,o);;)if('"'!=e[o])if(n&&0===w.length&&e.substr(o,k)===n){if(-1==O)return p();o=O+v,O=e.indexOf(r,o),x=e.indexOf(t,o)}else if(-1!==x&&(O>x||-1===O))w.push(e.substring(o,x)),o=x+m,x=e.indexOf(t,o);else{if(-1===O)break;if(w.push(e.substring(o,O)),l(O+v),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0)}else{var I=o;for(o++;;){var I=e.indexOf('"',I+1);if(-1===I)return f||R.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:b.length,index:o}),d();if(I===g-1){var D=e.substring(o,I).replace(/""/g,'"');return d(D)}if('"'!=e[I+1]){if(e[I+1]==t){w.push(e.substring(o,I).replace(/""/g,'"')),o=I+1+m,x=e.indexOf(t,o),O=e.indexOf(r,o);break}if(e.substr(I+1,v)===r){if(w.push(e.substring(o,I).replace(/""/g,'"')),l(I+1+v),x=e.indexOf(t,o),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0);break}}else I++}}return d()},this.abort=function(){u=!0},this.getCharIndex=function(){return o}}function h(){var e=document.getElementsByTagName("script");return e.length?e[e.length-1].src:""}function f(){if(!S.WORKERS_SUPPORTED)return!1;if(!b&&null===S.SCRIPT_PATH)throw new Error("Script path cannot be determined automatically when Papa Parse is loaded asynchronously. You need to set Papa.SCRIPT_PATH manually.");var t=S.SCRIPT_PATH||v;t+=(-1!==t.indexOf("?")?"&":"?")+"papaworker";var r=new e.Worker(t);return r.onmessage=c,r.id=w++,R[r.id]=r,r}function c(e){var t=e.data,r=R[t.workerId],n=!1;if(t.error)r.userError(t.error,t.file);else if(t.results&&t.results.data){var i=function(){n=!0,d(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},s={abort:i,pause:l,resume:l};if(m(r.userStep)){for(var a=0;a<t.results.data.length&&(r.userStep({data:[t.results.data[a]],errors:t.results.errors,meta:t.results.meta},s),!n);a++);delete t.results}else m(r.userChunk)&&(r.userChunk(t.results,s,t.file),delete t.results)}t.finished&&!n&&d(t.workerId,t.results)}function d(e,t){var r=R[e];m(r.userComplete)&&r.userComplete(t),r.terminate(),delete R[e]}function l(){throw"Not implemented."}function p(t){var r=t.data;if("undefined"==typeof S.WORKER_ID&&r&&(S.WORKER_ID=r.workerId),"string"==typeof r.input)e.postMessage({workerId:S.WORKER_ID,results:S.parse(r.input,r.config),finished:!0});else if(e.File&&r.input instanceof File||r.input instanceof Object){var n=S.parse(r.input,r.config);n&&e.postMessage({workerId:S.WORKER_ID,results:n,finished:!0})}}function _(e){if("object"!=typeof e)return e;var t=e instanceof Array?[]:{};for(var r in e)t[r]=_(e[r]);return t}function g(e,t){return function(){e.apply(t,arguments)}}function m(e){return"function"==typeof e}var v,k=!e.document&&!!e.postMessage,y=k&&/(\?|&)papaworker(=|&|$)/.test(e.location.search),b=!1,R={},w=0,S={};if(S.parse=t,S.unparse=r,S.RECORD_SEP=String.fromCharCode(30),S.UNIT_SEP=String.fromCharCode(31),S.BYTE_ORDER_MARK="\ufeff",S.BAD_DELIMITERS=["\r","\n",'"',S.BYTE_ORDER_MARK],S.WORKERS_SUPPORTED=!k&&!!e.Worker,S.SCRIPT_PATH=null,S.LocalChunkSize=10485760,S.RemoteChunkSize=5242880,S.DefaultDelimiter=",",S.Parser=u,S.ParserHandle=o,S.NetworkStreamer=i,S.FileStreamer=s,S.StringStreamer=a,"undefined"!=typeof module&&module.exports?module.exports=S:m(e.define)&&e.define.amd?define(function(){return S}):e.Papa=S,e.jQuery){var C=e.jQuery;C.fn.parse=function(t){function r(){if(0==a.length)return void(m(t.complete)&&t.complete());var e=a[0];if(m(t.before)){var r=t.before(e.file,e.inputElem);if("object"==typeof r){if("abort"==r.action)return void n("AbortError",e.file,e.inputElem,r.reason);if("skip"==r.action)return void i();"object"==typeof r.config&&(e.instanceConfig=C.extend(e.instanceConfig,r.config))}else if("skip"==r)return void i()}var s=e.instanceConfig.complete;e.instanceConfig.complete=function(t){m(s)&&s(t,e.file,e.inputElem),i()},S.parse(e.file,e.instanceConfig)}function n(e,r,n,i){m(t.error)&&t.error({name:e},r,n,i)}function i(){a.splice(0,1),r()}var s=t.config||{},a=[];return this.each(function(){var t="INPUT"==C(this).prop("tagName").toUpperCase()&&"file"==C(this).attr("type").toLowerCase()&&e.FileReader;if(!t||!this.files||0==this.files.length)return!0;for(var r=0;r<this.files.length;r++)a.push({file:this.files[r],inputElem:this,instanceConfig:C.extend({},s)})}),r(),this}}y?e.onmessage=p:S.WORKERS_SUPPORTED&&(v=h(),document.body?document.addEventListener("DOMContentLoaded",function(){b=!0},!0):b=!0),i.prototype=Object.create(n.prototype),i.prototype.constructor=i,s.prototype=Object.create(n.prototype),s.prototype.constructor=s,a.prototype=Object.create(a.prototype),a.prototype.constructor=a}("undefined"!=typeof window?window:this);var CRYPTO={paranoia_level:null,PASSWORD:{generate:function(length,callback,progress,start_string){return sjcl.random.isReady(paranoia_level)?(null==start_string&&(start_string=""),start_string.length<length?(start_string+=CRYPTO.RANDOM.getRandomASCII(),null!=progress&&progress(start_string.length/length*100),void setTimeout(this.generate(length,callback,progress,start_string),100)):(callback(start_string),void(null!=progress&&progress(100)))):void setTimeout(this.generate(length,callback,progress,start_string),500);
+},logRepeatedCharCount:function(str){var chars=[];for(i=0;i<str.length;i++)chars[str.charAt(i)]=null==chars[str.charAt(i)]?0:chars[str.charAt(i)]+1;return chars}},RANDOM:{getRandomASCII:function(){for(var ret="";ret.length<4;){var int=sjcl.random.randomWords(1,paranoia_level);int=int[0];var tmp=this._isASCII((4278190080&int)>>24);tmp&&(ret+=tmp),tmp=this._isASCII((16711680&int)>>16),tmp&&(ret+=tmp),tmp=this._isASCII((65280&int)>>8),tmp&&(ret+=tmp),tmp=this._isASCII(255&int),tmp&&(ret+=tmp)}return ret},_isASCII:function(data){return data>31&&data<127&&String.fromCharCode(data)}},initEngines:function(default_paranoia){paranoia_level=default_paranoia||10,sjcl.random.setDefaultParanoia(this.paranoia_level),sjcl.random.startCollectors(),console.warn("Crypto stuff initialized")}};CRYPTO.initEngines(),function(){angular.module("passmanApp",["ngAnimate","ngCookies","ngResource","ngRoute","ngSanitize","ngTouch","templates-main","LocalStorageModule","offClick","ngPasswordMeter","ngclipboard","xeditable","ngTagsInput","angularjs-datetime-picker","ui.sortable","pascalprecht.translate"]).config(function($routeProvider){$routeProvider.when("/",{templateUrl:"views/vaults.html",controller:"VaultCtrl"}).when("/vault/:vault_id",{templateUrl:"views/show_vault.html",controller:"CredentialCtrl"}).when("/vault/:vault_id/new",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/edit/:credential_id",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/:credential_id/share",{templateUrl:"views/share_credential.html",controller:"ShareCtrl"}).when("/vault/:vault_id/:credential_id/revisions",{templateUrl:"views/credential_revisions.html",controller:"RevisionCtrl"}).when("/vault/:vault_id/settings",{templateUrl:"views/settings.html",controller:"SettingsCtrl"}).otherwise({redirectTo:"/"})}).config(["$httpProvider",function($httpProvider){$httpProvider.defaults.headers.common.requesttoken=oc_requesttoken}]).config(function(localStorageServiceProvider){localStorageServiceProvider.setNotify(!0,!0)}).config(function($translateProvider){$translateProvider.useSanitizeValueStrategy("sanitizeParameters"),$translateProvider.useUrlLoader(OC.generateUrl("/apps/passman/api/v2/language")),$translateProvider.preferredLanguage("en")}),jQuery(document).ready(function(){var findItemByID=function(id){var credentials,foundItem=!1;return credentials=angular.element("#app-content-wrapper").scope().credentials,angular.forEach(credentials,function(credential){credential.credential_id===id&&(foundItem=credential)}),foundItem};jQuery(document).on("click",".undoDelete",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().recoverCredential(credential),angular.element("#app-content-wrapper").scope().$apply()}),jQuery(document).on("click",".undoRestore",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().deleteCredential(credential),angular.element("#app-content-wrapper").scope().$apply()})})}(),function(){angular.module("passmanApp").filter("as",function($parse){return function(value,context,path){return $parse(path).assign(context,value)}})}(),function(){angular.module("passmanApp").filter("bytes",function(){return function(bytes,precision){if(isNaN(parseFloat(bytes))||!isFinite(bytes))return"-";"undefined"==typeof precision&&(precision=1);var units=["bytes","kB","MB","GB","TB","PB"],number=Math.floor(Math.log(bytes)/Math.log(1024));return(bytes/Math.pow(1024,Math.floor(number))).toFixed(precision)+" "+units[number]}})}(),function(){angular.module("passmanApp").filter("credentialSearch",function(){return function(credentials,filter){var _credentials=[];if(credentials){if(!filter)return credentials;if(""===filter.filterText.trim())return credentials;for(var matchedWithFilter=function(c){for(var f=0;f<filter.fields.length;f++){var field=filter.fields[f],fieldValue="string"==typeof c[field]?c[field]:JSON.stringify(c[field]);if(filter.hasOwnProperty("useRegex")&&filter.useRegex===!0)try{var patt=new RegExp(filter.filterText);if(patt.test(fieldValue))return!0}catch(e){}if(fieldValue.toLowerCase().indexOf(filter.filterText.toLowerCase())>=0)return!0}return!1},ci=0;ci<credentials.length;ci++){var c=credentials[ci];matchedWithFilter(c)&&_credentials.push(c)}return _credentials}return[]}})}(),function(){angular.module("passmanApp").filter("propsFilter",function(){return function(items,props){var out=[];if(angular.isArray(items)){var keys=Object.keys(props);items.forEach(function(item){for(var itemMatches=!1,i=0;i<keys.length;i++){var prop=keys[i],text=props[prop].toLowerCase();if(item[prop].toString().toLowerCase().indexOf(text)!==-1){itemMatches=!0;break}}itemMatches&&out.push(item)})}else out=items;return out}})}(),function(){angular.module("passmanApp").filter("range",function(){return function(val,range){range=parseInt(range);for(var i=0;i<range;i++)val.push(i);return val}})}(),function(){angular.module("passmanApp").filter("tagFilter",function(){return function(credentials,tags){var _credentials=[];if(tags.length>0)for(var ci=0;ci<credentials.length;ci++){for(var c=credentials[ci],matches=0,ct=0;ct<c.tags_raw.length;ct++){var t=c.tags_raw[ct];tags.indexOf(t.text)!==-1&&matches++}matches===tags.length&&_credentials.push(c)}return 0===tags.length&&(_credentials=credentials),_credentials}})}(),function(){angular.module("passmanApp").filter("toHHMMSS",function(){return function(_seconds){var sec_num=parseInt(_seconds,10),hours=Math.floor(sec_num/3600),minutes=Math.floor((sec_num-3600*hours)/60),seconds=sec_num-3600*hours-60*minutes;return hours<10&&(hours="0"+hours),minutes<10&&(minutes="0"+minutes),seconds<10&&(seconds="0"+seconds),hours+":"+minutes+":"+seconds}})}(),function(){angular.module("passmanApp").service("CacheService",["localStorageService","EncryptService",function(localStorageService,EncryptService){return{get:function(name){return EncryptService.decryptString(localStorageService.get(name))},set:function(key,value){value=EncryptService.encryptString(value),localStorageService.set(key,value)}}}])}(),function(){angular.module("passmanApp").service("CredentialService",["$http","EncryptService","VaultService","FileService",function($http,EncryptService,VaultService,FileService){var credential={credential_id:null,guid:null,vault_id:null,label:null,description:null,created:null,changed:null,tags:[],email:null,username:null,password:null,url:null,favicon:null,renew_interval:null,expire_time:0,delete_time:0,files:[],custom_fields:[],otp:{},hidden:!1},_encryptedFields=["description","username","password","files","custom_fields","otp","email","tags","url"];return{newCredential:function(){return angular.copy(credential)},createCredential:function(credential){for(var _credential=angular.copy(credential),i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue))}_credential.expire_time=new Date(angular.copy(credential.expire_time)).getTime()/1e3;var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials");return $http.post(queryUrl,_credential).then(function(response){return response.data?response.data:response})},getEncryptedFields:function(){return _encryptedFields},updateCredential:function(credential,skipEncyption){var _credential=angular.copy(credential);if(!skipEncyption)for(var i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue))}_credential.expire_time=new Date(angular.copy(credential.expire_time)).getTime()/1e3;var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+credential.guid);return $http.patch(queryUrl,_credential).then(function(response){return response.data?response.data:response})},getCredential:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid);return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},destroyCredential:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},encryptCredential:function(credential,key){for(var i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),key)}return credential},decryptCredential:function(credential,key){for(var i=0;i<_encryptedFields.length;i++){var field_decrypted_value,field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);try{field_decrypted_value=EncryptService.decryptString(fieldValue,key)}catch(e){throw e}try{credential[field]=JSON.parse(field_decrypted_value)}catch(e){console.warn("Field"+field+" in "+credential.label+" could not be parsed! Value:"+fieldValue)}}return credential},getRevisions:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid+"/revision");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},updateRevision:function(revision){var _revision=angular.copy(revision);_revision.credential_data=window.btoa(JSON.stringify(_revision.credential_data));var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+revision.credential_data.guid+"/revision/"+revision.revision_id);return $http.patch(queryUrl,_revision).then(function(response){return response.data?response.data:response})},deleteRevision:function(credential_guid,revision_id){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+credential_guid+"/revision/"+revision_id);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},reencryptCredential:function(credential_guid,old_password,new_password){var service=this,progress_datatype=function(current,total,process){this.process=process,this.current=current,this.total=total,this.calculated=current/total*100},promise_credential_update=function(){service.getCredential(credential_guid).then(function(credential){this.parent.plain_credential=service.decryptCredential(credential,this.parent.old_password);var tmp=angular.copy(this.parent.plain_credential);this.parent.new_credential_cryptogram=service.encryptCredential(tmp,this.parent.new_password),this.call_progress(new progress_datatype(1,2,"credential")),this.parent.new_credential_cryptogram.skip_revision=!0,service.updateCredential(this.parent.new_credential_cryptogram,!0).then(function(){this.call_progress(new progress_datatype(2,2,"credential")),this.call_then({plain_text:this.parent.plain_credential,cryptogram:this.parent.new_credential_cryptogram})}.bind(this))}.bind(this))},promise_files_update=function(){this.total=2*this.parent.plain_credential.files.length,this.current=0;for(var i=0;i<this.parent.plain_credential.files.length;i++){var _file=this.parent.plain_credential.files[i];FileService.getFile(_file).then(function(fileData){fileData.filename=EncryptService.decryptString(fileData.filename,this.parent.old_password),fileData.file_data=EncryptService.decryptString(fileData.file_data,this.parent.old_password),this.current++,this.call_progress(new progress_datatype(this.current,this.total,"files")),FileService.updateFile(fileData,this.parent.new_password).then(function(){this.current++,this.call_progress(new progress_datatype(this.current,this.total,"files")),this.current===this.total&&this.call_then("All files has been updated")}.bind(this))}.bind(this))}0===this.parent.plain_credential.files.length&&(this.call_progress(new progress_datatype(0,0,"files")),this.call_then("No files to update"))},promise_revisions_update=function(){service.getRevisions(this.parent.plain_credential.guid).then(function(revisions){this.total=2*revisions.length,this.upload=0,this.current=0,this.revisions=revisions;var revision_workload=function(){if(0===this.revisions.length)return this.call_progress(new progress_datatype(0,0,"revisions")),void this.call_then("No history to update");var _revision=revisions[this.current];_revision.credential_data=service.decryptCredential(_revision.credential_data,this.parent.old_password),_revision.credential_data=service.encryptCredential(_revision.credential_data,this.parent.new_password),this.current++,this.call_progress(new progress_datatype(this.current+this.upload,this.total,"revisions")),service.updateRevision(_revision).then(function(){this.upload++,this.call_progress(new progress_datatype(this.upload+this.current,this.total,"revisions")),this.current+this.upload===this.total&&this.call_then("History updated")}.bind(this)),this.current!==this.total/2&&setTimeout(revision_workload.bind(this),1)};setTimeout(revision_workload.bind(this),1)}.bind(this))},promise_workload=function(){this.old_password=angular.copy(old_password),this.new_password=angular.copy(new_password),this.promises=0;var master_promise=this,password_data=function(){this.old_password=master_promise.old_password,this.new_password=master_promise.new_password,this.plain_credential=master_promise.plain_credential};this.credential_data={},new C_Promise(promise_credential_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(data){console.warn("End credential update"),master_promise.plain_credential=data.plain_text,master_promise.promises++,master_promise.credential_data=data,new C_Promise(promise_files_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(){console.warn("End files update"),master_promise.promises--,0===master_promise.promises&&master_promise.call_then(master_promise.credential_data)}),master_promise.promises++,new C_Promise(promise_revisions_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(){console.warn("End revisions update"),master_promise.promises--,0===master_promise.promises&&master_promise.call_then(master_promise.credential_data)})})};return new C_Promise(promise_workload)}}}])}(),function(){angular.module("passmanApp").service("EncryptService",["VaultService",function(VaultService){var encryption_config={adata:"",iter:1e3,ks:256,mode:"ccm",ts:64};return{encryptString:function(string,_key){_key||(_key=VaultService.getActiveVault().vaultKey);var rp={},ct=sjcl.encrypt(_key,string,encryption_config,rp);return window.btoa(ct)},decryptString:function(ciphertext,_key){_key||(_key=VaultService.getActiveVault().vaultKey),ciphertext=window.atob(ciphertext);var rp={};try{return sjcl.decrypt(_key,ciphertext,encryption_config,rp)}catch(e){throw e}}}}])}(),function(){angular.module("passmanApp").service("FileService",["$http","EncryptService",function($http,EncryptService){return{uploadFile:function(file,key){var queryUrl=OC.generateUrl("apps/passman/api/v2/file"),_file=angular.copy(file);_file.filename=EncryptService.encryptString(_file.filename,key);var data=EncryptService.encryptString(angular.copy(file.data),key);return _file.data=data,$http.post(queryUrl,_file).then(function(response){return response.data?response.data:response})},deleteFile:function(file){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);return $http.delete(queryUrl,_file).then(function(response){return response.data?response.data:response})},getFile:function(file){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);return $http.get(queryUrl,_file).then(function(response){return response.data?"[object Array]"===Object.prototype.toString.call(response.data)?response.data.pop():response.data:response})},updateFile:function(file,key){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);_file.filename=EncryptService.encryptString(_file.filename,key);var data=EncryptService.encryptString(angular.copy(file.file_data),key);return _file.file_data=data,$http.patch(queryUrl,_file).then(function(response){return response.data?response.data:response})},dataURItoBlob:function(dataURI,ftype){var byteString,ab,ia,bb,i;for(byteString=atob(dataURI.split(",")[1]),ab=new ArrayBuffer(byteString.length),ia=new Uint8Array(ab),i=0;i<byteString.length;i++)ia[i]=byteString.charCodeAt(i);return bb=new Blob([ab],{type:ftype}),URL.createObjectURL(bb)}}}])}(),function(){angular.module("passmanApp").service("NotificationService",["$timeout",function($timeout){var to;return{showNotification:function(text,time,closeCallback){var notification=OC.Notification.showHtml(text);return to=$timeout(function(){OC.Notification.hide(notification,closeCallback)},time),notification},hideNotification:function(notification){$timeout.cancel(to),OC.Notification.hide(notification)},hideAll:function(){OC.Notification.hide()}}}])}(),function(){angular.module("passmanApp").service("SettingsService",["localStorageService","$http","$rootScope",function(localStorageService,$http,$rootScope){var settings={defaultVault:null,defaultVaultPass:null};$http.get(OC.generateUrl("apps/passman/api/v2/settings")).then(function(response){response.data&&(settings=angular.merge(settings,response.data),$rootScope.$broadcast("settings_loaded"))});var cookie=localStorageService.get("settings");return settings=angular.merge(settings,cookie),{getSettings:function(){return settings},getSetting:function(name){return settings[name]},setSetting:function(name,value){settings[name]=value,localStorageService.set("settings",settings)}}}])}(),function(){angular.module("passmanApp").service("ShareService",["$http","VaultService","EncryptService","CredentialService",function($http,VaultService,EncryptService,CredentialService){var paranoia_level=10;return sjcl.random.setDefaultParanoia(paranoia_level),sjcl.random.startCollectors(),{search:function(string){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/search");return $http.post(queryUrl,{search:string}).then(function(response){return response.data?response.data:response})},shareWithUser:function(credential,target_user_data){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/share");return $http.post(queryUrl,{item_id:credential.credential_id,item_guid:credential.guid,permissions:target_user_data.accessLevel,vaults:target_user_data.vaults})},getVaultsByUser:function(userId){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/vaults/"+userId);return $http.get(queryUrl,{search:userId}).then(function(response){if(response.data){for(var i=0;i<response.data.length;i++)response.data[i].public_sharing_key=forge.pki.publicKeyFromPem(response.data[i].public_sharing_key);return response.data}return response})},getPendingRequests:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/pending");return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},saveSharingRequest:function(request,crypted_shared_key){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/save");return $http.post(queryUrl,{item_guid:request.item_guid,target_vault_guid:request.target_vault_guid,final_shared_key:crypted_shared_key}).then(function(response){return response.data})},declineSharingRequest:function(request){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/decline/"+request.req_id);return $http.delete(queryUrl).then(function(response){return response.data})},unshareCredential:function(credential){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid);return $http.delete(queryUrl).then(function(response){return response.data})},unshareCredentialFromUser:function(credential,user_id){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/"+user_id);return $http.delete(queryUrl).then(function(response){return response.data})},createPublicSharedCredential:function(shareObj){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/public");return $http.post(queryUrl,shareObj).then(function(response){return response.data})},getPublicSharedCredential:function(credential_guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential_guid+"/public");return $http.get(queryUrl).then(function(response){return response.data?response:response},function(result){return result})},getSharedCredentialACL:function(credential){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/acl");return $http.get(queryUrl).then(function(response){return response.data?response.data:response},function(result){return result})},updateCredentialAcl:function(credential,acl){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/acl");return $http.patch(queryUrl,acl).then(function(response){return response.data})},getCredendialsSharedWithUs:function(vault_guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/vault/"+vault_guid+"/get");return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},downloadSharedFile:function(credential,file){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/file/"+file.guid);return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},encryptSharedCredential:function(credential,sharedKey){var _credential=angular.copy(credential);_credential.shared_key=EncryptService.encryptString(sharedKey);for(var encrypted_fields=CredentialService.getEncryptedFields(),i=0;i<encrypted_fields.length;i++){var field=encrypted_fields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),sharedKey)}return _credential},decryptSharedCredential:function(credential,sharedKey){for(var _credential=angular.copy(credential),encrypted_fields=CredentialService.getEncryptedFields(),i=0;i<encrypted_fields.length;i++){var field_decrypted_value,field=encrypted_fields[i],fieldValue=angular.copy(_credential[field]);if(_credential.hasOwnProperty(field)){try{field_decrypted_value=EncryptService.decryptString(fieldValue,sharedKey)}catch(e){throw e}try{_credential[field]=JSON.parse(field_decrypted_value)}catch(e){throw console.warn("Field"+field+" in "+_credential.label+" could not be parsed! Value:"+fieldValue),e}}}return _credential},generateRSAKeys:function(key_length){var p=new C_Promise(function(){var state=forge.pki.rsa.createKeyPairGenerationState(key_length,65537),step=function(){forge.pki.rsa.stepKeyPairGenerationState(state,100)?this.call_then(state.keys):(null!==state.p?this.call_progress(50):this.call_progress(0),setTimeout(step.bind(this),1))};setTimeout(step.bind(this),100)});return p},generateSharedKey:function(size){return size=size||20,new C_Promise(function(){var t=this;CRYPTO.PASSWORD.generate(size,function(pass){t.call_then(pass)},function(progress){t.call_progress(progress)})})},rsaKeyPairToPEM:function(keypair){return{publicKey:forge.pki.publicKeyToPem(keypair.publicKey),privateKey:forge.pki.privateKeyToPem(keypair.privateKey)}},getSharingKeys:function(){var vault=VaultService.getActiveVault();return{private_sharing_key:EncryptService.decryptString(angular.copy(vault.private_sharing_key)),public_sharing_key:vault.public_sharing_key}},rsaPrivateKeyFromPEM:function(private_pem){return forge.pki.privateKeyFromPem(private_pem)},rsaPublicKeyFromPEM:function(public_pem){return forge.pki.publicKeyFromPem(public_pem)},cypherRSAStringWithPublicKeyBulkAsync:function(vaults,string){var workload=function(){if(this.current_index<this.vaults.length>0&&this.vaults.length>0){var _vault=angular.copy(this.vaults[this.current_index]);_vault.key=forge.util.encode64(_vault.public_sharing_key.encrypt(this.string)),this.data.push(_vault),this.current_index++,this.call_progress(this.current_index),setTimeout(workload.bind(this),1)}else this.call_then(this.data)};return new C_Promise(function(){this.data=[],this.vaults=vaults,this.string=string,this.current_index=0,setTimeout(workload.bind(this),0)})}}}])}(),function(){angular.module("passmanApp").service("TagService",["$filter",function($filter){var _tags=[];return{getTags:function(){return _tags},searchTag:function(string){return $filter("filter")(_tags,{text:string})},addTags:function(tags){for(var i=0;i<tags.length;i++)tags[i].text&&0===$filter("filter")(_tags,{text:tags[i].text}).length&&_tags.push(tags[i])}}}])}(),function(){angular.module("passmanApp").service("VaultService",["$http",function($http){var _activeVault,_this=this,service={getVaults:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},setActiveVault:function(vault){_activeVault=angular.copy(vault)},getActiveVault:function(){return _activeVault},getVaultSetting:function(key,default_value){return _activeVault.vault_settings&&void 0!==_activeVault.vault_settings[key]?_activeVault.vault_settings[key]:default_value},setVaultSetting:function(key,value){return!!_activeVault.vault_settings&&(_activeVault.vault_settings[key]=value,void _this.updateVault(_activeVault))},createVault:function(vaultName){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults");return $http.post(queryUrl,{vault_name:vaultName}).then(function(response){return response.data?response.data:response})},getVault:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.guid);return $http.get(queryUrl).then(function(response){return response.data?(response.data.vault_settings?response.data.vault_settings=JSON.parse(window.atob(response.data.vault_settings)):response.data.vault_settings={},response.data):response})},updateVault:function(vault){var _vault=angular.copy(vault);delete _vault.defaultVaultPass,delete _vault.defaultVault,delete _vault.vaultKey,_vault.vault_settings=window.btoa(JSON.stringify(_vault.vault_settings));var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+_vault.guid);return $http.patch(queryUrl,_vault).then(function(response){return response.data?response.data:response})},updateSharingKeys:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.guid+"/sharing-keys");return $http.post(queryUrl,vault).then(function(response){return response.data?response.data:response})},deleteVault:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.guid);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})}};return service}])}(),function(){angular.module("passmanApp").factory("SharingACL",function(){function ACL(acl_permission){this.permission=acl_permission}return ACL.prototype.permissions={READ:1,WRITE:2,FILES:4,HISTORY:8,OWNER:128},ACL.prototype.hasPermission=function(permission){return permission===(this.permission&permission)},ACL.prototype.addPermission=function(permission){this.permission=this.permission|permission},ACL.prototype.removePermission=function(permission){this.permission=this.permission&~permission},ACL.prototype.togglePermission=function(permission){this.permission^=permission},ACL.prototype.getAccessLevel=function(){return this.permission},ACL})}(),function(){angular.module("passmanApp").directive("autoScroll",function(){return{restrict:"A",scope:{autoScroll:"="},link:function(scope){scope.$watch("autoScroll",function(){$("#import_log").scrollTop($("#import_log")[0].scrollHeight)},!0)}}})}(),function(){angular.module("passmanApp").directive("clearBtn",["$parse",function($parse){return{link:function(scope,elm,attr){elm.wrap("<div style='position: relative'></div>");var btn="<span id="+Math.round(1e9*Math.random())+' class="searchclear ng-hide fa fa-times-circle-o"></span>',angularBtn=angular.element(btn);elm.after(angularBtn),angularBtn.on("click",function(){elm.val("").trigger("change"),$parse(attr.ngModel).assign(scope,""),scope.$apply()}),elm.bind("focus keyup change paste propertychange",function(){elm.val()&&elm.val().length>0?angularBtn.removeClass("ng-hide"):angularBtn.addClass("ng-hide")})}}}])}(),function(){angular.module("passmanApp").directive("selectOnClick",["$window",function($window){return{restrict:"A",link:function(scope,element){element.on("click",function(){$window.getSelection().toString()||this.setSelectionRange(0,this.value.length)})}}}])}(),function(){angular.module("passmanApp").directive("colorFromString",[function(){return{restrict:"A",scope:{string:"=colorFromString"},link:function(scope,el){function genColor(str){for(var hash=0,i=0;i<str.length;i++)hash=str.charCodeAt(i)+((hash<<5)-hash);var c=(16777215&hash).toString(16).toUpperCase();return"#"+"00000".substring(0,6-c.length)+c}scope.$watch("string",function(){jQuery(el).css("border-color",genColor(scope.string))})}}}])}(),function(){angular.module("passmanApp").directive("credentialField",["$timeout","$translate",function($timeout,$translate){return{scope:{value:"=value",secret:"=secret"},restrict:"A",replace:"true",template:'<span class="credential_field"><div class="value" ng-class="{\'ellipsis\': isLink}"><span ng-repeat="n in [] | range:value.length" ng-if="!valueVisible">*</span><span ng-if="valueVisible" ng-bind-html="value"></span></div><div class="tools"><div class="cell" ng-if="toggle" tooltip="tggltxt" ng-click="toggleVisibility()"><i class="fa" ng-class="{\'fa-eye\': !valueVisible, \'fa-eye-slash\': valueVisible }"></i></div><div class="cell" ng-if="isLink"><a ng-href="{{value}}" target="_blank" rel="nofollow noopener noreferrer"><i tooltip="\'Open in new window\'" class="link fa fa-external-link"></i></a></div><div class="cell" ngclipboard-success="onSuccess(e);" ngclipboard-error="onError(e);" ngclipboard data-clipboard-text="{{value}}"><i tooltip="copy_msg" class="fa fa-clipboard"></i></div></div></span>',link:function(scope){var expression=/(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/gi,regex=new RegExp(expression);$translate(["toggle.visibility","copy","copied"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["copy.field"]}),scope.$watch("value",function(){scope.value&&(scope.secret&&(scope.valueVisible=!1),regex.test(scope.value)&&(scope.isLink=!0))}),scope.toggle||scope.secret&&(scope.toggle=!0);var timer;scope.onSuccess=function(){scope.copy_msg=$translate.instant("copied"),$timeout.cancel(timer),timer=$timeout(function(){scope.copy_msg=$translate.instant("copy")},5e3)},scope.valueVisible=!0,scope.toggleVisibility=function(){scope.valueVisible=!scope.valueVisible}}}}])}(),function(){angular.module("passmanApp").directive("fileSelect",["$window",function($window){return{restrict:"A",scope:{success:"&success",error:"&error",progress:"&progress"},link:function(scope,el){scope.success=scope.success(),scope.error=scope.error(),scope.progress=scope.progress();var _currentFile,fileReader=new $window.FileReader;fileReader.onload=function(){_currentFile.data=fileReader.result,scope.success(_currentFile)},fileReader.onprogress=function(event){var percent=event.loaded/event.total*100;scope.$apply(scope.progress({file_total:event.total,file_loaded:event.loaded,file_percent:percent}))},fileReader.onerror=function(){scope.error()},el.bind("change",function(e){var i,_queueTotalFileSize=0;for(i=0;i<e.target.files.length;i++)_queueTotalFileSize+=e.target.files[i].size;for(i=0;i<e.target.files.length;i++){_currentFile=e.target.files[i];var mb_limit=5;_currentFile.size>1024*mb_limit*1024&&scope.error("TO_BIG",_currentFile),fileReader.readAsDataURL(_currentFile)}})}}}])}(),function(){angular.module("passmanApp").directive("ngEnter",function(){return function(scope,element,attrs){element.bind("keydown keypress",function(event){13===event.which&&(scope.$apply(function(){scope.$eval(attrs.ngEnter)}),event.preventDefault())})}})}(),function(){angular.module("passmanApp").directive("otpGenerator",["$compile","$timeout",function($compile,$timeout){function dec2hex(s){
+return(s<15.5?"0":"")+Math.round(s).toString(16)}function hex2dec(s){return parseInt(s,16)}function base32tohex(base32){if(base32){var i,base32chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bits="",hex="";for(i=0;i<base32.length;i++){var val=base32chars.indexOf(base32.charAt(i).toUpperCase());bits+=leftpad(val.toString(2),5,"0")}for(i=0;i+4<=bits.length;i+=4){var chunk=bits.substr(i,4);hex+=parseInt(chunk,2).toString(16)}return hex}}function leftpad(str,len,pad){return len+1>=str.length&&(str=Array(len+1-str.length).join(pad)+str),str}return{restrict:"A",template:'<span class="otp_generator"><span credential-field value="otp" secret="\'true\'"></span> <span ng-bind="timeleft"></span></span>',transclude:!1,scope:{secret:"="},replace:!0,link:function(scope){scope.otp=null,scope.timeleft=null,scope.timer=null;var updateOtp=function(){if(scope.secret){var key=base32tohex(scope.secret),epoch=Math.round((new Date).getTime()/1e3),time=leftpad(dec2hex(Math.floor(epoch/30)),16,"0"),hmacObj=new jsSHA(time,"HEX"),hmac=hmacObj.getHMAC(key,"HEX","SHA-1","HEX"),offset=hex2dec(hmac.substring(hmac.length-1)),otp=(hex2dec(hmac.substr(2*offset,8))&hex2dec("7fffffff"))+"";otp=otp.substr(otp.length-6,6),scope.otp=otp}},timer=function(){var epoch=Math.round((new Date).getTime()/1e3),countDown=30-epoch%30;epoch%30===0&&updateOtp(),scope.timeleft=countDown,scope.timer=$timeout(timer,1e3)};scope.$watch("secret",function(n){n?($timeout.cancel(scope.timer),updateOtp(),timer()):$timeout.cancel(scope.timer)},!0),scope.$on("$destroy",function(){$timeout.cancel(scope.timer)})}}}])}(),function(){angular.module("passmanApp").directive("passwordGen",function($timeout,$translate){function Arcfour(){this.j=this.i=0,this.S=[]}function ARC4init(r){var t,n,e;for(t=0;256>t;++t)this.S[t]=t;for(t=n=0;256>t;++t)n=n+this.S[t]+r[t%r.length]&255,e=this.S[t],this.S[t]=this.S[n],this.S[n]=e;this.j=this.i=0}function ARC4next(){var r;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,r=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=r,this.S[r+this.S[this.i]&255]}function prng_newstate(){return new Arcfour}function generatePassword(r,t,n,e,o,i,p,g){var _,a,s,f,d,h,u,l,c,v,w,y,m;if(void 0===r&&(r=8+get_random(0,1)),r>256&&(r=256,document.getElementById("length").value=256),i>256&&(i=256),void 0===t&&(t=!0),void 0===n&&(n=!0),void 0===e&&(e=!0),void 0===o&&(o=!1),void 0===i&&(i=0),void 0===p&&(p=!1),void 0===g&&(g=!0),_=0,a=0,s=0,g&&(_=a=s=1),f=[],n&&_>0)for(d=0;_>d;d++)f[f.length]="L";if(t&&a>0)for(d=0;a>d;d++)f[f.length]="U";if(e&&i>0)for(d=0;i>d;d++)f[f.length]="D";if(o&&s>0)for(d=0;s>d;d++)f[f.length]="S";for(;f.length<r;)f[f.length]="A";for(f.sort(function(){return 2*get_random(0,1)-1}),h="",u="abcdefghjkmnpqrstuvwxyz",p||(u+="ilo"),n&&(h+=u),l="ABCDEFGHJKMNPQRSTUVWXYZ",p||(l+="ILO"),t&&(h+=l),c="23456789",p||(c+="10"),e&&(h+=c),v="!@#$%^&*",o&&(h+=v),w="",y=0;r>y;y++){switch(f[y]){case"L":m=u;break;case"U":m=l;break;case"D":m=c;break;case"S":m=v;break;case"A":m=h}d=get_random(0,m.length-1),w+=m.charAt(d)}return w}function rng_seed_int(r){rng_pool[rng_pptr++]^=255&r,rng_pool[rng_pptr++]^=r>>8&255,rng_pool[rng_pptr++]^=r>>16&255,rng_pool[rng_pptr++]^=r>>24&255,rng_pptr>=rng_psize&&(rng_pptr-=rng_psize)}function rng_seed_time(){rng_seed_int((new Date).getTime())}function rng_get_byte(){if(null==rng_state){for(rng_seed_time(),rng_state=prng_newstate(),rng_state.init(rng_pool),rng_pptr=0;rng_pptr<rng_pool.length;++rng_pptr)rng_pool[rng_pptr]=0;rng_pptr=0}return rng_state.next()}function rng_get_bytes(r){var t;for(t=0;t<r.length;++t)r[t]=rng_get_byte()}function SecureRandom(){}function get_random(r,t){var n,e,o,i=t-r+1;for(rng_seed_time(),n=[],e=0;4>e;e++)n[e]=0;for(rng_get_bytes(n),o=0,e=0;4>e;e++)o*=256,o+=n[e];return o%=i,o+=r}var rng_psize,rng_state,rng_pool,rng_pptr,t,z,crypt_obj,num,buf,i;if(Arcfour.prototype.init=ARC4init,Arcfour.prototype.next=ARC4next,rng_psize=256,null==rng_pool){if(rng_pool=[],rng_pptr=0,"undefined"!=typeof navigator&&"Netscape"==navigator.appName&&navigator.appVersion<"5"&&"undefined"!=typeof window&&window.crypto)for(z=window.crypto.random(32),t=0;t<z.length;++t)rng_pool[rng_pptr++]=255&z.charCodeAt(t);try{if(crypt_obj=null,"undefined"!=typeof window&&void 0!==window.crypto?crypt_obj=window.crypto:"undefined"!=typeof window&&void 0!==window.msCrypto&&(crypt_obj=window.msCrypto),void 0!==crypt_obj&&"function"==typeof crypt_obj.getRandomValues&&rng_psize>rng_pptr)for(num=Math.floor((rng_psize-rng_pptr)/2)+1,buf=new Uint16Array(num),crypt_obj.getRandomValues(buf),i=0;i<buf.length;i++)t=buf[i],rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t}catch(e){}for(;rng_psize>rng_pptr;)t=Math.floor(65536*sjcl.random.randomWords(1)),rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t;rng_pptr=0,rng_seed_time()}return SecureRandom.prototype.nextBytes=rng_get_bytes,{scope:{model:"=ngModel",length:"@",placeholder:"@",settings:"=settings",callback:"&callback"},restrict:"E",replace:"true",template:'<div class=" pw-gen "><div class="input-group "><input ng-show="!passwordVisible" type="password" ng-disabled="disabled" class="form-control " ng-model="password" placeholder="{{placeholder}}"><input ng-show="passwordVisible" type="text" ng-disabled="disabled" class="form-control " ng-model="password" placeholder="{{placeholder}}"><span class="generate_pw"><div class="cell" tooltip="gen_msg" ng-click="generatePasswordStart()"><i class="fa fa-refresh"></i></div><div class="cell" tooltip="tggltxt" ng-click="toggleVisibility()"><i class="fa" ng-class="{\'fa-eye\': passwordVisible, \'fa-eye-slash\': !passwordVisible }"></i></div><div class="cell" tooltip="\'Copy password to clipboard\'"><i class="fa fa-clipboard" ngclipboard-success="onSuccess(e);" ngclipboard-error="onError(e);" ngclipboard data-clipboard-text="{{password}}"></i></div></button></div></div>',link:function(scope){scope.callback=scope.callback(),scope.$watch("model",function(){scope.password=scope.model}),scope.passwordVisible=!1,scope.toggleVisibility=function(){scope.passwordVisible=!scope.passwordVisible},scope.passwordNotNull=!1,scope.$watch("settings",function(){scope.settings&&!scope.password&&scope.settings.generateOnCreate&&scope.generatePasswordStart()}),$translate(["password.gen","password.copy","copied","toggle.visibility"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["password.copy"],scope.gen_msg=translations["password.gen"]}),scope.$watch("password",function(){scope.model=scope.password,scope.password_repeat=scope.model}),scope.onSuccess=function(e){OC.Notification.showTemporary($translate.instant("password.copied")),e.clearSelection()},scope.onError=function(){OC.Notification.showTemporary("Press Ctrl+C to copy!")},scope.progressDivShow=!1,scope.generatePasswordStart=function(){scope.progressDivShow=!0,scope.progressValue=0,scope.progressWidth={width:scope.progressValue+"%"},scope.generatePasswordProgress()},scope.generatePasswordProgress=function(){$timeout(function(){scope.progressValue<100?(scope.password=scope._generatePassword(scope.settings),scope.progressValue+=10,scope.progressWidth={width:scope.progressValue+"%"},scope.disabled=!0,scope.generatePasswordProgress()):(scope.disabled=!1,scope.callback&&scope.callback(scope.password))},10)},scope._generatePassword=function(settings){var _settings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0};settings=angular.merge(_settings,settings);var password=generatePassword(settings.length,settings.useUppercase,settings.useLowercase,settings.useDigits,settings.useSpecialChars,settings.minimumDigitCount,settings.avoidAmbiguousCharacters,settings.requireEveryCharType);return password}}}})}(),function(){angular.module("passmanApp").directive("progressBar",["$translate",function($translate){return{restrict:"A",template:'<div class="progress"><div class="progress-bar" role="progressbar" aria-valuenow="{{progress}}"aria-valuemin="0" aria-valuemax="100" style="width:{{progress}}%;" use-theme><span class="sr-only">{{progress}}% {{completed_text}}</span><span ng-if="index && total" class="progress-label" use-theme type="\'color\'" color="\'true\'">{{index}} / {{total}}</span><span ng-if="!index && !total" class="progress-label" use-theme type="\'color\'" color="\'true\'">{{progress}}%</span></div></div>',scope:{progress:"=progressBar",index:"=index",total:"=total"},link:function(scope){$translate(["complete"]).then(function(translations){scope.completed_text=translations.complete})}}}])}(),function(){angular.module("passmanApp").directive("qrread",["$parse",function($parse){return{scope:!0,link:function(scope,element,attributes){var invoker=$parse(attributes.onRead);scope.imageData=null,qrcode.callback=function(result){invoker(scope,{qrdata:{qrData:result,image:scope.imageData}})},element.bind("change",function(changeEvent){var reader=new FileReader,file=changeEvent.target.files[0];reader.readAsDataURL(file),reader.onload=function(){return function(e){scope.imageData=e.target.result,qrcode.decode(e.target.result)}}(file)})}}}])}(),function(){angular.module("passmanApp").directive("tooltip",[function(){return{restrict:"A",scope:{tooltip:"=tooltip"},link:function(scope,el){scope.$watch("tooltip",function(){scope.tooltip&&(jQuery(el).attr("title",scope.tooltip),jQuery(el).tooltip(),jQuery(el).attr("title",scope.tooltip).tooltip("fixTitle"),jQuery(".tooltip-inner").text(scope.tooltip),jQuery(el).is(":visible"))})}}}])}(),function(){angular.module("passmanApp").directive("useTheme",[function(){function invertColor(hexTripletColor){var color=hexTripletColor;return color=color.substring(1),color=parseInt(color,16),color^=16777215,color=color.toString(16),color=("000000"+color).slice(-6),color="#"+color}return{restrict:"A",scope:{type:"=type",color:"=",negative:"="},link:function(scope,el){var _color=jQuery("#header").css("background-color"),_bg=_color;scope.negative&&(_bg=invertColor(_bg)),scope.type?jQuery(el).css(scope.type,_bg):jQuery(el).css("background-color",_bg),scope.color&&jQuery(el).css("color",invertColor(_color))}}}])}();var PassmanImporter={};!function(window,$,PassmanImporter){PassmanImporter.parseRow_=function(row){row=row.trim();var isQuoted=!1;return'"'===row.charAt(0)&&(row=row.substring(1),isQuoted=!0),'"'===row.charAt(row.length-2)&&(row=row.substring(0,row.length-2),isQuoted=!0),row=isQuoted===!0?row.split('","'):row.split(",")},PassmanImporter.htmlDecode=function(input){var e=document.createElement("div");return e.innerHTML=input,e.childNodes[0].nodeValue},PassmanImporter.toObject_=function(headings,row){for(var result={},i=0,ii=row.length;i<ii;i++)headings[i]?(headings[i]=headings[i].replace(",","_").toLowerCase().replace(" ","_").replace("(","").replace(")","").replace('"',""),result[headings[i]]=row[i]):result[ii]=row[i];return result},PassmanImporter.join_=function(arr,sep){for(var parts=[],i=0,ii=arr.length;i<ii;i++)arr[i]&&parts.push(arr[i]);return parts.join(sep)},PassmanImporter.newCredential=function(){var credential={credential_id:null,guid:null,vault_id:null,label:null,description:null,created:null,changed:null,tags:[],email:null,username:null,password:null,url:null,favicon:null,renew_interval:null,expire_time:0,delete_time:0,files:[],custom_fields:[],otp:{},hidden:!1};return credential},PassmanImporter.readCsv=function(csv,hasHeadings){hasHeadings=void 0===hasHeadings||hasHeadings;var lines=[];return Papa.parse(csv,{complete:function(results){if(results.data)for(var headings=hasHeadings?results.data[0]:null,start=hasHeadings?1:0,i=start;i<results.data.length;i++){var _row=hasHeadings?PassmanImporter.toObject_(headings,results.data[i]):results.data[i];lines.push(_row)}}}),lines},PassmanImporter.readJson=function(string){return JSON.parse(string)}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.clippers={info:{name:"Clipperz.is",id:"clippers",description:"Go to menu -> Export -> Download HTML + JSON. Fields will be imported as custom fields."}},PassmanImporter.clippers.readFile=function(file_data){return new C_Promise(function(){var credential_list=[],re=/<textarea>(.*?)<\/textarea>/gi,matches=re.exec(file_data);if(matches){var raw_json=matches[0].substring(10);raw_json=PassmanImporter.htmlDecode(raw_json.slice(0,-11));for(var json_objects=PassmanImporter.readJson(raw_json),i=0;i<json_objects.length;i++){var card=json_objects[i];re=/(\w+)/gi;var tags=card.label.match(re);card.label=card.label.replace(tags.join(" "),"").trim(),tags=tags.map(function(item){return{text:item.replace("","")}});var _credential=PassmanImporter.newCredential();_credential.label=card.label,_credential.description=card.data.notes,_credential.tags=tags;for(var field in card.currentVersion.fields){var field_data=card.currentVersion.fields[field];_credential.custom_fields.push({label:field_data.label,value:field_data.value,secret:field_data.hidden===!0})}_credential.label&&credential_list.push(_credential);var progress={percent:i/json_objects.length*100,loaded:i,total:json_objects.length};this.call_progress(progress)}}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.dashLaneCsv={info:{name:"Dashlane 4 csv",id:"dashLaneCsv",description:"Create an csv export. Go to File -> export -> Unsecured archive (readable) in CSV format"}},PassmanImporter.dashLaneCsv.readFile=function(file_data){return new C_Promise(function(){for(var rows=file_data.split("\n"),credential_list=[],i=0;i<rows.length;i++){var row=rows[i],row_data=row.split('","');'"'===row_data[0].charAt(0)&&(row_data[0]=row_data[0].substring(1)),'"'===row_data[row_data.length-1].toString().charAt(row_data[row_data.length-1].length-1)&&(row_data[row_data.length-1]=row_data[row_data.length-1].substring(0,row_data[row_data.length-1].length-1));var _credential=PassmanImporter.newCredential();_credential.label=row_data[0],_credential.username=row_data[2],_credential.password=row_data[row_data.length-2],_credential.url=row_data[0],_credential.description=row_data[row_data.length-1],_credential.label&&credential_list.push(_credential);var progress={percent:i/rows.length*100,loaded:i,total:rows.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.keepassCsv={info:{name:"KeePass csv",id:"keepassCsv",description:"Create an csv export with the following options enabled: http://i.imgur.com/CaeTA4d.png"}},PassmanImporter.keepassCsv.readFile=function(file_data){var p=new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row.account,_credential.username=row.login_name,_credential.password=row.password,_credential.url=row.web_site,row.hasOwnProperty("expires")&&(row.expires=row.expires.replace('"',""),_credential.expire_time=new Date(row.expires).getTime()/1e3);var tags=row.group?[{text:row.group}]:[];if(row.hasOwnProperty("group_tree"))for(var exploded_tree=row.group_tree.split("\\\\"),t=0;t<exploded_tree.length;t++)exploded_tree[t].trim().length>0&&tags.push({text:exploded_tree[t].trim()});_credential.tags=tags,credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)});return p}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.lastpassCsv={info:{name:"LastPass csv",id:"lastpassCsv",description:"Create an csv export. Go to More options -> Advanced -> Export -> Last Pass CSV File"}},PassmanImporter.lastpassCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=PassmanImporter.htmlDecode(row.name),_credential.username=row.username,_credential.password=row.password,_credential.url=row.url,_credential.tags=row.grouping?[{text:row.grouping}]:[],_credential.description=row.extra,_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.passmanJson={info:{name:"Passman JSON",id:"passmanJson",description:"Export the item in passman as passman json, with all fields enabled"}},PassmanImporter.passmanJson.readFile=function(file_data){return new C_Promise(function(){for(var parsed_json=PassmanImporter.readJson(file_data),credential_list=[],i=0;i<parsed_json.length;i++){var item=parsed_json[i],_credential=PassmanImporter.newCredential();if(_credential.label=item.label,_credential.username=item.account,_credential.password=item.password,_credential.email=item.email,_credential.url=item.url,_credential.tags=item.tags,_credential.description=item.description,item.hasOwnProperty("customFields")&&item.customFields.length>0)for(var cf=0;cf<item.customFields.length;cf++)_credential.custom_fields.push({label:item.customFields[cf].label,value:item.customFields[cf].value,secret:"1"===item.customFields[cf].clicktoshow});item.hasOwnProperty("otpsecret")&&item.otpsecret&&(_credential.otp={issuer:item.otpsecret.issuer,label:item.otpsecret.label,qr_uri:{image:item.otpsecret.qrCode,qrData:""},secret:item.otpsecret.secret,type:item.otpsecret.type}),_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_json.length*100,loaded:i,total:parsed_json.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.passpackCsv={info:{name:"Passpack csv",id:"passpackCsv",description:"Go to Tools -> Export. Select Comma Separated Values, All entries then continue."}},PassmanImporter.passpackCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data,!1),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row[0],_credential.username=row[1],_credential.password=row[2],_credential.url=row[3];var tags=row[4].split(" ");tags.length>0&&(_credential.tags=tags.map(function(item){if(item)return{text:item}}).filter(function(item){return item})),_credential.description=row[5],_credential.email=row[6],_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.randomData={info:{name:"Random data",id:"randomData",description:"Create's 50 random credentials for testing purposes."}},PassmanImporter.randomData.readFile=function(){return new C_Promise(function(){var label,tags=["Social media","Hosting","Forums","Webshops","FTP","SSH","Banking","Applications","Server stuff","mysql","Wifi","Games","Certificate","Serials"],credential_list=[],_this=this,generateCredential=function(max,i,callback){if(jQuery){var url=OC.generateUrl("apps/passman/api/internal/generate_person");$.ajax({url:url,dataType:"json",success:function(data){if(data){var _credential=PassmanImporter.newCredential();label=Math.random()>=.5?data.domain:data.email_d+" - "+data.email_u,_credential.label=label,_credential.username=data.username,_credential.password=data.password,_credential.url=data.url;for(var tag_amount=Math.floor(5*Math.random()),ta=0,_tags=[];ta<tag_amount;){var item=tags[Math.floor(Math.random()*tags.length)];_tags.indexOf(item)===-1&&(_tags.push(item),ta++)}if(_credential.tags=_tags.map(function(item){if(item)return{text:item}}).filter(function(item){return item}),credential_list.push(_credential),i<max){var progress={percent:i/max*100,loaded:i,total:max};_this.call_progress(progress),generateCredential(max,i+1,callback)}else callback(credential_list)}else generateCredential(max,i,callback)}})}};generateCredential(50,1,function(credential_list){_this.call_then(credential_list)})})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};if(function(window,$,PassmanImporter){PassmanImporter.zohoCsv={info:{name:"ZOHO csv",id:"zohoCsv",description:'Create an csv export. Go to Tools -> Export secrets -> Select "General CSV" and click "Export Secrets"'}},PassmanImporter.zohoCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();if(_credential.label=row.secret_name,_credential.url=row.secret_url,_credential.description=row.notes,row.hasOwnProperty("secretdata"))for(var rows=row.secretdata.split("\n"),r=0;r<rows.length;r++){var cells=rows[r].split(":"),key=cells[0],value=cells.slice(1).join(":");key&&value&&_credential.custom_fields.push({label:key,value:value,secret:!1})}""!==_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter),!window.PassmanExporter)var PassmanExporter={};PassmanExporter.csv={info:{name:"CSV",id:"csv",description:"Export credentials as csv."}},PassmanExporter.csv.export=function(credentials){return new C_Promise(function(){for(var _this=this,headers=["label","username","password","email","description","tags"],file_data='"'+headers.join('","')+'"\n',i=0;i<credentials.length;i++){for(var _credential=credentials[i],row_data=[],h=0;h<headers.length;h++){var field=headers[h];if("tags"===field){for(var _tags=[],t=0;t<_credential[field].length;t++)_tags.push(_credential[field][t].text);var data="["+_tags.join(",")+"]";row_data.push('"'+data+'"')}else row_data.push('"'+_credential[field]+'"')}var progress={percent:i/credentials.length*100,loaded:i,total:credentials.length};_this.call_progress(progress),file_data+=row_data.join(",")+"\n"}_this.call_then(),download(file_data,"passman-export.csv")})},function(){angular.module("passmanApp").controller("BookmarkletCtrl",["$scope","$rootScope","$location","VaultService","CredentialService","SettingsService","NotificationService","EncryptService","TagService","FileService","ShareService","$translate",function($scope,$rootScope,$location,VaultService,CredentialService,SettingsService,NotificationService,EncryptService,TagService,FileService,ShareService,$translate){if($scope.active_vault=!1,$scope.http_warning_hidden=!0,"http"===$location.$$protocol&&($scope.using_http=!0),$scope.logout=function(){$scope.active_vault=!1},SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));VaultService.getVault(_vault).then(function(vault){vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(vault),$scope.active_vault=vault,$scope.pwSettings=VaultService.getVaultSetting("pwSettings",{length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})})}VaultService.getVaults().then(function(vaults){$scope.vaults=vaults}),$scope.default_vault=!1,$scope.remember_vault_password=!1,$scope.list_selected_vault=!1,$scope.toggleDefaultVault=function(){$scope.default_vault=!$scope.default_vault,$scope.default_vault===!0?SettingsService.setSetting("defaultVault",$scope.list_selected_vault):SettingsService.setSetting("defaultVault",null)},$scope.toggleRememberPassword=function(){$scope.remember_vault_password=!$scope.remember_vault_password,$scope.remember_vault_password&&(SettingsService.setSetting("defaultVault",$scope.list_selected_vault),$scope.default_vault=!0),$scope.remember_vault_password!==!0&&SettingsService.setSetting("defaultVault",null)},$scope.clearState=function(){$scope.list_selected_vault=!1,$scope.creating_vault=!1,$scope.error=!1},$scope.selectVault=function(vault){$scope.list_selected_vault=vault},$scope.sharing_keys={},$scope.newVault=function(){$scope.creating_vault=!0;var key_size=1024;ShareService.generateRSAKeys(key_size).progress(function(progress){var p=progress>0?2:1,msg=$translate.instant("generating.sharing.keys");msg=msg.replace("%step",p),$scope.creating_keys=msg,$scope.$digest()}).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.sharing_keys.private_sharing_key=pem.privateKey,$scope.sharing_keys.public_sharing_key=pem.publicKey,$scope.$digest()})};var _loginToVault=function(vault,vault_key){var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),delete _vault.credentials,$scope.active_vault=_vault};$scope.vaultDecryptionKey="",$scope.loginToVault=function(vault,vault_key){$scope.error=!1;var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);try{EncryptService.decryptString(vault.challenge_password),$scope.remember_vault_password&&SettingsService.setSetting("defaultVaultPass",vault_key),_loginToVault(vault,vault_key)}catch(e){$scope.error=$translate.instant("invalid.vault.key")}},$scope.createVault=function(vault_name,vault_key,vault_key2){return vault_key!==vault_key2?void($scope.error=$translate.instant("password.do.not.match")):void VaultService.createVault(vault_name).then(function(vault){$scope.vaults.push(vault);var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);var test_credential=CredentialService.newCredential();test_credential.label="Test key for vault "+vault_name,test_credential.hidden=!0,test_credential.vault_id=vault.vault_id,test_credential.password="lorum ipsum",CredentialService.createCredential(test_credential).then(function(){_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),VaultService.updateSharingKeys(_vault).then(function(){_loginToVault(vault,vault_key)})})})},$scope.storedCredential=CredentialService.newCredential();var QueryString=function(){for(var query_string={},query=window.location.search.substring(1),vars=query.split("&"),i=0;i<vars.length;i++){var pair=vars[i].split("=");if("undefined"==typeof query_string[pair[0]])query_string[pair[0]]=decodeURIComponent(pair[1]);else if("string"==typeof query_string[pair[0]]){var arr=[query_string[pair[0]],decodeURIComponent(pair[1])];query_string[pair[0]]=arr}else query_string[pair[0]].push(decodeURIComponent(pair[1]))}return query_string}(),query_string=QueryString;$scope.storedCredential.label=query_string.title,$scope.storedCredential.url=query_string.url,$scope.setHttpWarning=function(state){$scope.http_warning_hidden=state},$translate(["general","password","custom.fields","files","otp"]).then(function(translations){$scope.tabs=[{title:translations.general,url:"views/partials/forms/edit_credential/basics.html",color:"blue"},{title:translations.password,url:"views/partials/forms/edit_credential/password.html",color:"green"},{title:translations["custom.fields"],url:"views/partials/forms/edit_credential/custom_fields.html",color:"orange"},{title:translations.files,url:"views/partials/forms/edit_credential/files.html",color:"yellow"},{title:translations.otp,url:"views/partials/forms/edit_credential/otp.html",color:"purple"}],$scope.currentTab=$scope.tabs[0]}),$scope.getTags=function($query){return TagService.searchTag($query)},$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},$scope.pwGenerated=function(pass){$scope.storedCredential.password_repeat=pass};var _customField={label:"",value:"",secret:!1,field_type:"text"};$scope.selected_field_type="text",$scope.new_custom_field=angular.copy(_customField),$scope.addCustomField=function(){var _field=angular.copy($scope.new_custom_field);if(_field.label||NotificationService.showNotification($translate.instant("error.no.label"),3e3),_field.value||NotificationService.showNotification($translate.instant("error.no.value"),3e3),_field.label&&_field.value)if($scope.selected_field_type="text",_field.secret=angular.copy("password"===$scope.selected_field_type),_field.field_type=angular.copy($scope.selected_field_type),"file"===_field.field_type){var _file=$scope.new_custom_field.value;FileService.uploadFile(_file).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename),_field.value=result,$scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)})}else $scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)},$scope.addFileToCustomField=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};$scope.new_custom_field.value=_file,$scope.$digest()},$scope.deleteCustomField=function(field){field.hasOwnProperty("field_type")&&"file"===field.field_type&&FileService.deleteFile(field.value);var idx=$scope.storedCredential.custom_fields.indexOf(field);$scope.storedCredential.custom_fields.splice(idx,1)},$scope.new_file={name:"",data:null},$scope.deleteFile=function(file){var idx=$scope.storedCredential.files.indexOf(file);FileService.deleteFile(file).then(function(){$scope.storedCredential.files.splice(idx,1)})},$scope.fileLoaded=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};FileService.uploadFile(_file).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename),$scope.storedCredential.files.push(result)}),$scope.$digest()},$scope.fileLoadError=function(error){return error},$scope.selected_file="",$scope.fileprogress=[],$scope.fileSelectProgress=function(progress){progress&&($scope.fileprogress=progress,$scope.$digest())},$scope.renewIntervalValue=0,$scope.renewIntervalModifier="0",$scope.updateInterval=function(renewIntervalValue,renewIntervalModifier){var value=parseInt(renewIntervalValue),modifier=parseInt(renewIntervalModifier);value&&modifier&&($scope.storedCredential.renew_interval=value*modifier)},$scope.parseQR=function(QRCode){var parsedQR,qrInfo,re=/otpauth:\/\/(totp|hotp)\/(.*)\?(secret|issuer)=(.*)&(issuer|secret)=(.*)/;qrInfo=[],parsedQR=QRCode.qrData.match(re),parsedQR&&(qrInfo={type:parsedQR[1],label:decodeURIComponent(parsedQR[2]),qr_uri:QRCode}),qrInfo[parsedQR[3]]=parsedQR[4],qrInfo[parsedQR[5]]=parsedQR[6],$scope.storedCredential.otp=qrInfo,$scope.$digest()},$scope.saveCredential=function(){delete $scope.storedCredential.password_repeat,$scope.storedCredential.credential_id||($scope.storedCredential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential($scope.storedCredential).then(function(){NotificationService.showNotification($translate.instant("credential.created"),5e3)}))}}])}(),function(){angular.module("passmanApp").controller("CredentialCtrl",["$scope","VaultService","SettingsService","$location","CredentialService","$rootScope","FileService","EncryptService","TagService","$timeout","NotificationService","CacheService","ShareService","SharingACL","$interval","$filter","$routeParams","$sce","$translate",function($scope,VaultService,SettingsService,$location,CredentialService,$rootScope,FileService,EncryptService,TagService,$timeout,NotificationService,CacheService,ShareService,SharingACL,$interval,$filter,$routeParams,$sce,$translate){
+if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else $scope.active_vault||$location.path("/");$scope.show_spinner=!0;var fetchCredentials=function(){VaultService.getVault({guid:$routeParams.vault_id}).then(function(vault){var vaultKey=angular.copy($scope.active_vault.vaultKey),_credentials=angular.copy(vault.credentials);vault.credentials=[],$scope.active_vault=vault,$scope.active_vault.vaultKey=vaultKey,VaultService.setActiveVault($scope.active_vault);for(var i=0;i<_credentials.length;i++){var _credential=_credentials[i];try{if(_credential.shared_key){var enc_key=EncryptService.decryptString(_credential.shared_key);_credential=ShareService.decryptSharedCredential(angular.copy(_credential),enc_key)}else _credential=CredentialService.decryptCredential(angular.copy(_credential));_credential.tags_raw=_credential.tags}catch(e){NotificationService.showNotification($translate.instant("error.decrypt"),5e3)}_credential.tags&&TagService.addTags(_credential.tags),_credentials[i]=_credential}ShareService.getCredendialsSharedWithUs(vault.guid).then(function(shared_credentials){for(var c=0;c<shared_credentials.length;c++){var _shared_credential_data,_shared_credential=shared_credentials[c],decrypted_key=EncryptService.decryptString(_shared_credential.shared_key);try{_shared_credential_data=ShareService.decryptSharedCredential(_shared_credential.credential_data,decrypted_key)}catch(e){}_shared_credential_data&&(delete _shared_credential.credential_data,_shared_credential_data.acl=_shared_credential,_shared_credential_data.acl.permissions=new SharingACL(_shared_credential_data.acl.permissions),_shared_credential_data.tags_raw=_shared_credential_data.tags,_shared_credential_data.tags&&TagService.addTags(_shared_credential_data.tags),_credentials.push(_shared_credential_data))}angular.merge($scope.active_vault.credentials,_credentials),$scope.show_spinner=!1})})},getPendingShareRequests=function(){ShareService.getPendingRequests().then(function(shareRequests){shareRequests.length>0&&($scope.incoming_share_requests=shareRequests,jQuery(".share_popup").dialog({width:600,position:["center",90]}))})},refresh_data_interval=null;$scope.active_vault&&($scope.$parent.selectedVault=!0,fetchCredentials(),getPendingShareRequests(),refresh_data_interval=$interval(function(){fetchCredentials(),getPendingShareRequests()},3e5)),$scope.$on("$destroy",function(){$interval.cancel(refresh_data_interval)}),$scope.permissions=new SharingACL(0),$scope.hasPermission=function(acl,permission){if(acl){var tmp=new SharingACL(acl.permission);return tmp.hasPermission(permission)}return!0},$scope.acceptShareRequest=function(share_request){var crypted_shared_key=share_request.shared_key,private_key=EncryptService.decryptString(VaultService.getActiveVault().private_sharing_key);private_key=ShareService.rsaPrivateKeyFromPEM(private_key),crypted_shared_key=private_key.decrypt(forge.util.decode64(crypted_shared_key)),crypted_shared_key=EncryptService.encryptString(crypted_shared_key),ShareService.saveSharingRequest(share_request,crypted_shared_key).then(function(){var idx=$scope.incoming_share_requests.indexOf(share_request);$scope.incoming_share_requests.splice(idx,1);for(var active_share_requests=!1,v=0;v<$scope.incoming_share_requests.length;v++)$scope.incoming_share_requests[v].target_vault_id===$scope.active_vault.vault_id&&(active_share_requests=!0);active_share_requests===!1&&(jQuery(".ui-dialog").remove(),fetchCredentials())})},$scope.declineShareRequest=function(share_request){ShareService.declineSharingRequest(share_request).then(function(){var idx=$scope.incoming_share_requests.indexOf(share_request);$scope.incoming_share_requests.splice(idx,1);for(var active_share_requests=!1,v=0;v<$scope.incoming_share_requests.length;v++)$scope.incoming_share_requests[v].target_vault_id===$scope.active_vault.vault_id&&(active_share_requests=!0);active_share_requests===!1&&(jQuery(".ui-dialog").remove(),fetchCredentials())})};var settingsLoaded=function(){$scope.settings=SettingsService.getSettings()};SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.addCredential=function(){var new_credential=CredentialService.newCredential(),enc_c=CredentialService.encryptCredential(new_credential);SettingsService.setSetting("edit_credential",enc_c),$location.path("/vault/"+$scope.active_vault.guid+"/new")},$scope.editCredential=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("edit_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/edit/"+_credential.guid)},$scope.getRevisions=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("revision_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/"+_credential.guid+"/revisions")},$scope.shareCredential=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("share_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/"+_credential.guid+"/share")};var notification;$scope.deleteCredential=function(credential){var _credential=angular.copy(credential);try{_credential=CredentialService.decryptCredential(angular.copy(credential))}catch(e){}_credential.delete_time=(new Date).getTime()/1e3;for(var i=0;i<$scope.active_vault.credentials.length;i++)$scope.active_vault.credentials[i].credential_id===credential.credential_id&&($scope.active_vault.credentials[i].delete_time=_credential.delete_time);$scope.closeSelected(),notification&&NotificationService.hideNotification(notification),notification=NotificationService.showNotification($translate.instant("credential.deleted"),5e3,function(){CredentialService.updateCredential(_credential).then(function(result){result.delete_time>0&&(notification=!1)})})},$scope.recoverCredential=function(credential){var _credential=angular.copy(credential);try{_credential=CredentialService.decryptCredential(angular.copy(credential))}catch(e){}for(var i=0;i<$scope.active_vault.credentials.length;i++)$scope.active_vault.credentials[i].credential_id===credential.credential_id&&($scope.active_vault.credentials[i].delete_time=0);_credential.delete_time=0,$scope.closeSelected(),notification&&NotificationService.hideNotification(notification),NotificationService.showNotification($translate.instant("credential.recovered"),5e3,function(){CredentialService.updateCredential(_credential).then(function(){notification=!1})})},$scope.destroyCredential=function(credential){var _credential=angular.copy(credential);CredentialService.destroyCredential(_credential.guid).then(function(){for(var i=0;i<$scope.active_vault.credentials.length;i++)if($scope.active_vault.credentials[i].credential_id===credential.credential_id){$scope.active_vault.credentials.splice(i,1),NotificationService.showNotification($translate.instant("credential.destroyed"),5e3);break}})},$scope.view_mode="list",$scope.switchViewMode=function(viewMode){$scope.view_mode=viewMode},$scope.filterOptions={filterText:"",fields:["label","username","email","custom_fields"]},$scope.filtered_credentials=[],$scope.$watch("[selectedtags, filterOptions, delete_time, active_vault.credentials]",function(){if($scope.active_vault&&$scope.active_vault.credentials){var credentials=angular.copy($scope.active_vault.credentials),filtered_credentials=$filter("credentialSearch")(credentials,$scope.filterOptions);filtered_credentials=$filter("tagFilter")(filtered_credentials,$scope.selectedtags),filtered_credentials=$filter("filter")(filtered_credentials,{hidden:0}),$scope.filtered_credentials=filtered_credentials}},!0),$scope.selectedtags=[];var to;$rootScope.$on("selected_tags_updated",function(evt,_sTags){for(var _selectedTags=[],x=0;x<_sTags.length;x++)_selectedTags.push(_sTags[x].text);$scope.selectedtags=_selectedTags,$timeout.cancel(to),_selectedTags.length>0&&(to=$timeout(function(){if($scope.filtered_credentials){for(var _filtered_tags=[],i=0;i<$scope.filtered_credentials.length;i++)for(var tags=$scope.filtered_credentials[i].tags_raw,x=0;x<tags.length;x++){var tag=tags[x].text;_filtered_tags.indexOf(tag)===-1&&_filtered_tags.push(tag)}$rootScope.$emit("limit_tags_in_list",_filtered_tags)}},50))}),$scope.delete_time=0,$scope.showCredentialRow=function(credential){return 0===$scope.delete_time?0===credential.delete_time:credential.delete_time>$scope.delete_time},$rootScope.$on("set_delete_time",function(event,time){$scope.delete_time=time}),$scope.setDeleteTime=function(delete_time){$scope.delete_time=delete_time},$scope.selectedCredential=!1,$scope.selectCredential=function(credential){credential.description&&(credential.description_html=$sce.trustAsHtml(angular.copy(credential.description).replace("\n","<br />"))),$scope.selectedCredential=angular.copy(credential),$rootScope.$emit("app_menu",!0)},$scope.closeSelected=function(){$rootScope.$emit("app_menu",!1),$scope.selectedCredential=!1},$rootScope.$on("logout",function(){$scope.active_vault=null,$scope.credentials=[]}),$scope.downloadFile=function(credential,file){var callback=function(result){var key=null;if(!result.hasOwnProperty("file_data"))return void NotificationService.showNotification($translate.instant("error.loading.file.perm"),5e3);!credential.hasOwnProperty("acl")&&credential.hasOwnProperty("shared_key")&&credential.shared_key&&(key=EncryptService.decryptString(angular.copy(credential.shared_key))),credential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy(credential.acl.shared_key)));var file_data=EncryptService.decryptString(result.file_data,key);download(file_data,escapeHTML(file.filename),file.mimetype)};credential.hasOwnProperty("acl")?ShareService.downloadSharedFile(credential,file).then(callback):FileService.getFile(file).then(callback)}}])}(),function(){angular.module("passmanApp").controller("CredentialEditCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","FileService","EncryptService","TagService","NotificationService","ShareService","$translate",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,FileService,EncryptService,TagService,NotificationService,ShareService,$translate){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else if(!$scope.active_vault)return void $location.path("/");VaultService.getVault($scope.active_vault).then(function(vault){vault.vaultKey=VaultService.getActiveVault().vaultKey,delete vault.credentials,VaultService.setActiveVault(vault),$scope.pwSettings=VaultService.getVaultSetting("pwSettings",{length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})}),$scope.currentTab={title:$translate.instant("general"),url:"views/partials/forms/edit_credential/basics.html",color:"blue"},$translate(["general","password","custom.fields","files","otp"]).then(function(translations){$scope.tabs=[{title:translations.general,url:"views/partials/forms/edit_credential/basics.html",color:"blue"},{title:translations.password,url:"views/partials/forms/edit_credential/password.html",color:"green"},{title:translations["custom.fields"],url:"views/partials/forms/edit_credential/custom_fields.html",color:"orange"},{title:translations.files,url:"views/partials/forms/edit_credential/files.html",color:"yellow"},{title:translations.otp,url:"views/partials/forms/edit_credential/otp.html",color:"purple"}],$scope.currentTab=$scope.tabs[0]}),$scope.active_vault&&($scope.$parent.selectedVault=!0);var storedCredential=SettingsService.getSetting("edit_credential");storedCredential?($scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)),$scope.storedCredential.password_repeat=angular.copy($scope.storedCredential.password),$scope.storedCredential.expire_time=1e3*$scope.storedCredential.expire_time):CredentialService.getCredential($routeParams.credential_id).then(function(result){$scope.storedCredential=CredentialService.decryptCredential(angular.copy(result))}),$scope.getTags=function($query){return TagService.searchTag($query)},$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},$scope.pwGenerated=function(pass){$scope.storedCredential.password_repeat=pass};var _customField={label:"",value:"",secret:!1,field_type:"text"};$scope.selected_field_type="text",$scope.new_custom_field=angular.copy(_customField),$scope.addCustomField=function(){var _field=angular.copy($scope.new_custom_field);if(_field.label||NotificationService.showNotification($translate.instant("error.no.label"),3e3),_field.value||NotificationService.showNotification($translate.instant("error.no.value"),3e3),_field.label&&_field.value)if($scope.selected_field_type="text",_field.secret="password"===_field.field_type,"file"===_field.field_type){var key=!1,_file=$scope.new_custom_field.value;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),FileService.uploadFile(_file,key).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename,key),_field.value=result,$scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)})}else $scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)},$scope.addFileToCustomField=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};$scope.new_custom_field.value=_file,$scope.$digest()},$scope.deleteCustomField=function(field){field.hasOwnProperty("field_type")&&"file"===field.field_type&&FileService.deleteFile(field.value);var idx=$scope.storedCredential.custom_fields.indexOf(field);$scope.storedCredential.custom_fields.splice(idx,1)},$scope.new_file={name:"",data:null},$scope.deleteFile=function(file){var idx=$scope.storedCredential.files.indexOf(file);FileService.deleteFile(file).then(function(){$scope.storedCredential.files.splice(idx,1)})},$scope.fileLoaded=function(file){var key,_file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),FileService.uploadFile(_file,key).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename,key),$scope.storedCredential.files.push(result)}),$scope.$digest()},$scope.fileLoadError=function(error){console.log($translate.instant("error.loading.file"),error)},$scope.selected_file="",$scope.fileprogress=[],$scope.fileSelectProgress=function(progress){progress&&($scope.fileprogress=progress,$scope.$digest())},$scope.renewIntervalValue=0,$scope.renewIntervalModifier="0",$scope.updateInterval=function(renewIntervalValue,renewIntervalModifier){var value=parseInt(renewIntervalValue),modifier=parseInt(renewIntervalModifier);value&&modifier&&($scope.storedCredential.renew_interval=value*modifier)},$scope.parseQR=function(QRCode){var parsedQR,qrInfo,re=/otpauth:\/\/(totp|hotp)\/(.*)\?(secret|issuer)=(.*)&(issuer|secret)=(.*)/;qrInfo=[],parsedQR=QRCode.qrData.match(re),parsedQR&&(qrInfo={type:parsedQR[1],label:decodeURIComponent(parsedQR[2]),qr_uri:QRCode}),qrInfo[parsedQR[3]]=parsedQR[4],qrInfo[parsedQR[5]]=parsedQR[6],$scope.storedCredential.otp=qrInfo,$scope.$digest()},$scope.saveCredential=function(){if($scope.new_custom_field.label&&$scope.new_custom_field.value&&$scope.storedCredential.custom_fields.push(angular.copy($scope.new_custom_field)),delete $scope.storedCredential.password_repeat,$scope.storedCredential.credential_id){var key,_credential;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),_credential=key?ShareService.encryptSharedCredential($scope.storedCredential,key):angular.copy($scope.storedCredential),delete _credential.shared_key;var _useKey=null!=key,regex=/(<([^>]+)>)/gi;_credential.description&&""!==_credential.description&&(_credential.description=_credential.description.replace(regex,"")),CredentialService.updateCredential(_credential,_useKey).then(function(){SettingsService.setSetting("edit_credential",null),$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("credential.updated"),5e3)})}else $scope.storedCredential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential($scope.storedCredential).then(function(){$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("credential.created"),5e3)})},$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id)}}])}(),function(){angular.module("passmanApp").controller("ExportCtrl",["$scope","$window","CredentialService","VaultService","$translate",function($scope,$window,CredentialService,VaultService,$translate){$scope.available_exporters=[],$scope.active_vault=VaultService.getActiveVault(),$scope.$watch(function(){return $window.PassmanExporter},function(exporters){exporters=Object.keys(angular.copy(exporters));for(var i=0;i<exporters.length;i++){var exporter=exporters[i];$window.PassmanExporter[exporter].hasOwnProperty("info")&&$scope.available_exporters.push($window.PassmanExporter[exporter].info)}},!0),$scope.log=[],$scope.setExporter=function(exporter){exporter=JSON.parse(exporter),$scope.selectedExporter=exporter};var _log=function(str){$scope.log.push(str)};$scope.startExport=function(){_log($translate.instant("export.starting"));var _credentials=[];VaultService.getVault(VaultService.getActiveVault()).then(function(vault){if(_log($translate.instant("export.decrypt")),vault.hasOwnProperty("credentials")&&vault.credentials.length>0){for(var i=0;i<vault.credentials.length;i++){var _credential=angular.copy(vault.credentials[i]);0===_credential.hidden&&(_credential=CredentialService.decryptCredential(_credential),_credentials.push(_credential))}$window.PassmanExporter[$scope.selectedExporter.id].export(_credentials).then(function(){_log($translate.instant("done"))})}})}}])}(),function(){angular.module("passmanApp").controller("ImportCtrl",["$scope","$window","CredentialService","VaultService","$translate",function($scope,$window,CredentialService,VaultService,$translate){$scope.available_importers=[],$scope.active_vault=VaultService.getActiveVault(),$scope.$watch(function(){return $window.PassmanImporter},function(importers){for(var key in importers){var importer=importers[key];importer.hasOwnProperty("info")&&$scope.available_importers.push(importer.info)}},!0),$scope.log=[],$scope.setImporter=function(importer){importer=JSON.parse(importer),$scope.selectedImporter=importer};var file_data,_log=function(str){$scope.log.push(str)};$scope.fileLoaded=function(file){file_data=file.data.split(","),file_data=decodeURIComponent(escape(window.atob(file_data[1]))),_log($translate.instant("import.file.read")),$scope.$digest()},$scope.fileLoadError=function(file){console.error($translate.instant("error.loading.file"),file)},$scope.fileSelectProgress=function(){};var parsed_data;$scope.import_progress={progress:0,loaded:0,total:0};var addCredential=function(parsed_data_index){if(parsed_data[parsed_data_index]){var _credential=parsed_data[parsed_data_index];if(!_credential.label)return void(parsed_data[parsed_data_index+1]&&(_log($translate.instant("import.no.label")),addCredential(parsed_data_index+1)));_log($translate.instant("import.adding",{credential:_credential.label})),_credential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential(_credential).then(function(result){result.credential_id&&(_log($translate.instant("import.added",{credential:_credential.label})),parsed_data[parsed_data_index+1]?($scope.import_progress={progress:parsed_data_index/parsed_data.length*100,loaded:parsed_data_index,total:parsed_data.length},addCredential(parsed_data_index+1)):($scope.import_progress={progress:100,loaded:parsed_data.length,total:parsed_data.length},_log($translate.instant("done"))))})}};$scope.file_read_progress={percent:0,loaded:0,total:0},$scope.startImport=function(){$scope.import_progress=0,$scope.file_read_percent=0,file_data&&$window.PassmanImporter[$scope.selectedImporter.id].readFile(file_data).then(function(parseddata){parsed_data=parseddata,$scope.file_read_progress={percent:100,loaded:parsed_data.length,total:parsed_data.length};var msg=$translate.instant("import.loaded").replace("{{num}}",parsed_data.length);_log(msg),parsed_data.length>0&&addCredential(0)}).progress(function(progress){$scope.file_read_progress=progress,$scope.$digest()})}}])}(),function(){angular.module("passmanApp").controller("MainCtrl",["$scope","$rootScope","$location","SettingsService","$window","$interval","$filter",function($scope,$rootScope,$location,SettingsService,$window,$interval,$filter){$scope.selectedVault=!1,$scope.http_warning_hidden=!0,"http"===$location.$$protocol&&"localhost"!==$location.$$host&&"127.0.0.1"!==$location.$host&&($scope.using_http=!0,$scope.http_warning_hidden=!1),$rootScope.$on("settings_loaded",function(){"1"!==SettingsService.getSetting("disable_contextmenu")&&1!==SettingsService.getSetting("disable_contextmenu")||document.addEventListener("contextmenu",function(event){event.preventDefault()}),"0"!==SettingsService.getSetting("https_check")&&0!==SettingsService.getSetting("https_check")||($scope.http_warning_hidden=!0)}),$rootScope.setHttpWarning=function(state){$scope.http_warning_hidden=state},$rootScope.$on("app_menu",function(evt,shown){$scope.app_sidebar=shown}),$rootScope.$on("logout",function(){$scope.selectedVault=!1});var tickSessionTimer=function(){if($scope.session_time_left){$scope.session_time_left--;var session_time_left_formatted=$filter("toHHMMSS")($scope.session_time_left);$scope.translationData={session_time:session_time_left_formatted},$rootScope.$broadcast("logout_timer_tick_tack",$scope.session_time_left),0===$scope.session_time_left&&$window.location.reload()}};$scope.session_time_left=!1,$scope.$on("logout_timer_set",function(evt,timer){$scope.session_time_left=timer,$scope.translationData={session_time:timer},$interval(tickSessionTimer,1e3)})}])}(),function(){angular.module("passmanApp").controller("MenuCtrl",["$scope","VaultService","$location","$rootScope","TagService","SettingsService",function($scope,VaultService,$location,$rootScope,TagService,SettingsService){$rootScope.logout=function(){SettingsService.setSetting("defaultVaultPass",!1),$rootScope.$broadcast("logout"),$location.path("/")},$scope.selectedTags=[],$scope.getTags=function($query){return TagService.searchTag($query)},$scope.$watch(function(){return VaultService.getActiveVault()},function(vault){$scope.active_vault=vault}),$scope.filtered_tags=[],$rootScope.$on("limit_tags_in_list",function(evt,tags){$scope.filtered_tags=[];for(var i=0;i<tags.length;i++){for(var tag={text:tags[i]},found=!1,x=0;x<$scope.selectedTags.length;x++)$scope.selectedTags[x].text===tag.text&&(found=!0);found===!1&&$scope.filtered_tags.push(tag)}}),$scope.$watch("selectedTags",function(){$rootScope.$broadcast("selected_tags_updated",$scope.selectedTags)},!0),$scope.tagClicked=function(tag){$scope.selectedTags.push(tag)},$scope.available_tags=TagService.getTags(),$scope.$watch(function(){return 0===$scope.selectedTags.length?TagService.getTags():$scope.filtered_tags},function(tags){$scope.available_tags=tags},!0),$scope.toggleDeleteTime=function(){$scope.delete_time>0?$scope.delete_time=0:$scope.delete_time=1,$rootScope.$broadcast("set_delete_time",$scope.delete_time)}}])}(),function(){angular.module("passmanApp").controller("PublicSharedCredential",["$scope","ShareService","$window","EncryptService","NotificationService","$translate",function($scope,ShareService,$window,EncryptService,NotificationService,$translate){var _key;$scope.loading=!1,$scope.loadSharedCredential=function(){$scope.loading=!0;var data=window.atob($window.location.hash.replace("#","")).split("<::>"),guid=data[0];_key=data[1],ShareService.getPublicSharedCredential(guid).then(function(sharedCredential){$scope.loading=!1,200===sharedCredential.status?$scope.shared_credential=ShareService.decryptSharedCredential(sharedCredential.data.credential_data,_key):$scope.expired=!0})},$scope.downloadFile=function(credential,file){ShareService.downloadSharedFile(credential,file).then(function(result){if(!result.hasOwnProperty("file_data"))return void NotificationService.showNotification($translate.instant("error.loading.file.perm"),5e3);var file_data=EncryptService.decryptString(result.file_data,_key);download(file_data,escapeHTML(file.filename),file.mimetype)})}}])}(),function(){angular.module("passmanApp").controller("RevisionCtrl",["$scope","SettingsService","VaultService","CredentialService","$location","$routeParams","$rootScope","NotificationService","$filter","ShareService","EncryptService","$translate",function($scope,SettingsService,VaultService,CredentialService,$location,$routeParams,$rootScope,NotificationService,$filter,ShareService,EncryptService,$translate){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),VaultService.getVault(_vault).then(function(vault){vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(vault),$scope.active_vault=vault,$scope.$parent.selectedVault=!0})}}else $scope.active_vault||$location.path("/");$scope.active_vault&&($scope.$parent.selectedVault=!0);var storedCredential=SettingsService.getSetting("revision_credential"),getRevisions=function(){CredentialService.getRevisions($scope.storedCredential.guid).then(function(revisions){$scope.revisions=revisions})};storedCredential?($scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)),getRevisions()):CredentialService.getCredential($routeParams.credential_id).then(function(result){$scope.storedCredential=CredentialService.decryptCredential(angular.copy(result)),getRevisions()}),$scope.selectRevision=function(revision){var key;$scope.selectedRevision=angular.copy(revision),!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),key?$scope.selectedRevision.credential_data=ShareService.decryptSharedCredential(angular.copy(revision.credential_data),key):$scope.selectedRevision.credential_data=CredentialService.decryptCredential(angular.copy(revision.credential_data)),$rootScope.$emit("app_menu",!0)},$scope.closeSelected=function(){$rootScope.$emit("app_menu",!1),$scope.selectedRevision=!1},$scope.deleteRevision=function(revision){CredentialService.deleteRevision($scope.storedCredential.guid,revision.revision_id).then(function(){for(var i=0;i<$scope.revisions.length;i++)if($scope.revisions[i].revision_id===revision.revision_id){$scope.revisions.splice(i,1),NotificationService.showNotification($translate.instant("revision.deleted"),5e3);break}})},$scope.restoreRevision=function(revision){var key,_revision=angular.copy(revision),_credential=_revision.credential_data;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),key&&(_credential=ShareService.encryptSharedCredential(_credential,key)),delete _credential.shared_key,_credential.revision_created=$filter("date")(1e3*_revision.created,"dd-MM-yyyy @ HH:mm:ss"),CredentialService.updateCredential(_credential,key).then(function(){SettingsService.setSetting("revision_credential",null),$rootScope.$emit("app_menu",!1),$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("revision.restored"),5e3)})},$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id),$scope.storedCredential=null,SettingsService.setSetting("revision_credential",null)}}])}(),function(){angular.module("passmanApp").controller("SettingsCtrl",["$scope","$rootScope","SettingsService","VaultService","CredentialService","$location","$routeParams","$http","EncryptService","NotificationService","$sce","$translate",function($scope,$rootScope,SettingsService,VaultService,CredentialService,$location,$routeParams,$http,EncryptService,NotificationService,$sce,$translate){if($scope.vault_settings={},$scope.new_vault_name="",$scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else if(!$scope.active_vault)return void $location.path("/");VaultService.getVault($scope.active_vault).then(function(vault){vault.vaultKey=VaultService.getActiveVault().vaultKey,delete vault.credentials,VaultService.setActiveVault(vault),$scope.vault_settings=vault.vault_settings,$scope.vault_settings.hasOwnProperty("pwSettings")||($scope.vault_settings.pwSettings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})});var btn_txt=$translate.instant("bookmarklet.text"),http=location.protocol,slashes=http.concat("//"),host=slashes.concat(window.location.hostname),complete=host+location.pathname;
+$scope.bookmarklet=$sce.trustAsHtml('<a class="button" href="javascript:(function(){var a=window,b=document,c=encodeURIComponent,e=c(document.title),d=a.open(\''+complete+"bookmarklet?url='+c(b.location)+'&title='+e,'bkmk_popup','left='+((a.screenX||a.screenLeft)+10)+',top='+((a.screenY||a.screenTop)+10)+',height=750px,width=475px,resizable=0,alwaysRaised=1');a.setTimeout(function(){d.focus()},300);})();\">"+btn_txt+"</a>"),$scope.saveVaultSettings=function(){var _vault=$scope.active_vault;_vault.name=$scope.new_vault_name,_vault.vault_settings=angular.copy($scope.vault_settings),VaultService.updateVault(_vault).then(function(){$scope.active_vault.name=angular.copy(_vault.name),NotificationService.showNotification($translate.instant("settings.saved"),5e3)})},$scope.tabs=[{title:$translate.instant("settings.general"),url:"views/partials/forms/settings/general_settings.html"},{title:$translate.instant("settings.audit"),url:"views/partials/forms/settings/tool.html"},{title:$translate.instant("settings.password"),url:"views/partials/forms/settings/password_settings.html"},{title:$translate.instant("settings.import"),url:"views/partials/forms/settings/import.html"},{title:$translate.instant("settings.export"),url:"views/partials/forms/settings/export.html"},{title:$translate.instant("settings.sharing"),url:"views/partials/forms/settings/sharing.html"}],$scope.currentTab=$scope.tabs[0],$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url};var getPassmanVersion=function(){var url=OC.generateUrl("apps/passman/api/internal/version");$http.get(url).then(function(result){$scope.passman_version=result.data.version})};getPassmanVersion(),$scope.$watch(function(){return VaultService.getActiveVault()},function(vault){vault&&($scope.active_vault=vault)}),$rootScope.$on("logout",function(){$scope.selectedVault=!1});var getCurrentVaultCredentials=function(callback){VaultService.getVault($scope.active_vault).then(callback)},decryptOwnCredentials=function(vault){var _selected_credentials=[];0===vault.credentials.length&&$location.path("/");for(var i=0;i<vault.credentials.length;i++){var _credential=vault.credentials[i],isShared=null===_credential.shared_key||""===_credential.shared_key;if(isShared||!_credential.hasOwnProperty("acl")){var _success;try{CredentialService.decryptCredential(_credential,VaultService.getActiveVault().vaultKey),_success=!0}catch(e){_success=!1}_success&&_selected_credentials.push(_credential)}}return _selected_credentials};$scope.startScan=function(minStrength){getCurrentVaultCredentials(function(vault){for(var results=[],i=0;i<vault.credentials.length;i++){var c=angular.copy(vault.credentials[i]);if(c.password&&0===c.hidden)try{if(c=CredentialService.decryptCredential(c),c.password){var zxcvbn_result=zxcvbn(c.password);zxcvbn_result.score<=minStrength&&results.push({credential_id:c.credential_id,label:c.label,password:c.password,password_zxcvbn_result:zxcvbn_result})}}catch(e){console.warn(e)}}$scope.scan_result=results})},$scope.cur_state={},$scope.$on("$locationChangeStart",function(event){$scope.change_pw&&$scope.change_pw.total>0&&$scope.change_pw.done<$scope.change_pw.total&&(confirm($translate.instant("changepw.navigate.away.warning"))||event.preventDefault())}),$scope.changeVaultPassword=function(oldVaultPass,newVaultPass,newVaultPass2){return oldVaultPass!==VaultService.getActiveVault().vaultKey?void($scope.error=$translate.instant("incorrect.password")):newVaultPass!==newVaultPass2?void($scope.error=$translate.instant("password.no.match")):(SettingsService.setSetting("defaultVault",null),SettingsService.setSetting("defaultVaultPass",null),void VaultService.getVault($scope.active_vault).then(function(vault){var _selected_credentials=decryptOwnCredentials(vault);$scope.change_pw={percent:0,done:0,total:_selected_credentials.length};var changeCredential=function(index,oldVaultPass,newVaultPass){CredentialService.reencryptCredential(_selected_credentials[index].guid,oldVaultPass,newVaultPass).progress(function(data){$scope.cur_state=data}).then(function(){var percent=index/_selected_credentials.length*100;$scope.change_pw={percent:percent,done:index+1,total:_selected_credentials.length},index<_selected_credentials.length-1?changeCredential(index+1,oldVaultPass,newVaultPass):(vault.private_sharing_key=EncryptService.decryptString(angular.copy(vault.private_sharing_key),oldVaultPass),vault.private_sharing_key=EncryptService.encryptString(vault.private_sharing_key,newVaultPass),VaultService.updateSharingKeys(vault).then(function(){$rootScope.$broadcast("logout"),NotificationService.showNotification($translate.instant("login.new.pass"),5e3)}))})};changeCredential(0,VaultService.getActiveVault().vaultKey,newVaultPass)}))},$scope.confirm_vault_delete=!1,$scope.delete_vault_password="",$scope.delete_vault=function(){$scope.confirm_vault_delete&&$scope.delete_vault_password===VaultService.getActiveVault().vaultKey&&getCurrentVaultCredentials(function(vault){var credentials=vault.credentials;$scope.remove_pw={percent:0,done:0,total:vault.credentials.length};var deleteCredential=function(index){$scope.translationData={password:credentials[index].label},CredentialService.destroyCredential(credentials[index].guid).then(function(){var percent=index/vault.credentials.length*100;return $scope.remove_pw={percent:percent,done:index,total:vault.credentials.length},index===credentials.length-1?void VaultService.deleteVault(vault).then(function(){SettingsService.setSetting("defaultVaultPass",!1),SettingsService.setSetting("defaultVault",null),$rootScope.$broadcast("logout"),$location.path("/")}):void deleteCredential(index+1)})};deleteCredential(0)})},$rootScope.$on("logout",function(){$scope.active_vault=null,VaultService.setActiveVault(null),$location.path("/")}),$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id)}}])}(),function(){angular.module("passmanApp").controller("ShareCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","ShareService","NotificationService","SharingACL","EncryptService","$translate","$rootScope",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,ShareService,NotificationService,SharingACL,EncryptService,$translate,$rootScope){$scope.active_vault=VaultService.getActiveVault(),$scope.tabs=[{title:$translate.instant("share.u.g"),url:"views/partials/forms/share_credential/basics.html"},{title:$translate.instant("share.link"),url:"views/partials/forms/share_credential/link_sharing.html",color:"green"}],$scope.currentTab=$scope.tabs[0];var settingsLoaded=function(){var settings=SettingsService.getSettings();0!==settings.user_sharing_enabled&&"0"!==settings.user_sharing_enabled||$scope.tabs.splice(0,1),0!==settings.link_sharing_enabled&&"0"!==settings.link_sharing_enabled||$scope.tabs.splice(1,1),$scope.tabs.length>0&&($scope.currentTab=$scope.tabs[0])};if(SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else $scope.active_vault||$location.path("/");var storedCredential=SettingsService.getSetting("share_credential");storedCredential?$scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)):$location.path("/vault/"+$routeParams.vault_id),$scope.active_vault&&($scope.$parent.selectedVault=!0),$scope.cancel=function(){SettingsService.setSetting("share_credential",null),$location.path("/vault/"+$routeParams.vault_id)},$scope.default_permissions=new SharingACL(0),$scope.default_permissions.addPermission($scope.default_permissions.permissions.READ|$scope.default_permissions.permissions.WRITE|$scope.default_permissions.permissions.FILES);var link_acl=angular.copy($scope.default_permissions);link_acl.removePermission($scope.default_permissions.permissions.WRITE);var oneMonthLater=new Date;oneMonthLater.setMonth(oneMonthLater.getMonth()+1),$scope.share_settings={linkSharing:{enabled:!1,settings:{expire_time:oneMonthLater,expire_views:5,acl:link_acl}},credentialSharedWithUserAndGroup:[],cypher_progress:{done:0,total:0},upload_progress:{done:0,total:0}};var getAcl=function(){ShareService.getSharedCredentialACL($scope.storedCredential).then(function(aclList){for(var _list=[],enc_key=!!$scope.storedCredential.shared_key&&EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key)),i=0;i<aclList.length;i++){var acl=aclList[i];if(null===acl.user_id){if($scope.share_settings.linkSharing={enabled:!0,settings:{expire_time:new Date(1e3*acl.expire),expire_views:acl.expire_views,acl:new SharingACL(acl.permissions)}},enc_key){var hash=window.btoa($scope.storedCredential.guid+"<::>"+enc_key);$scope.share_link=getShareLink(hash)}}else{var obj={userId:acl.user_id,displayName:acl.user_id,type:"user",acl:new SharingACL(acl.permissions),acl_id:acl.acl_id,pending:acl.pending,credential_guid:acl.item_guid,created:acl.created};_list.push(obj)}}$scope.share_settings.credentialSharedWithUserAndGroup=_list})};getAcl();new SharingACL(0);$scope.$watch("share_settings.upload_progress.done",function(){$scope.share_settings.upload_progress.done===$scope.share_settings.upload_progress.total&&$scope.share_settings.upload_progress.total>0&&getAcl()}),$scope.inputSharedWith=[],$scope.searchUsers=function($query){return ShareService.search($query)},$scope.hasPermission=function(acl,permission){return acl.hasPermission(permission)},$scope.setPermission=function(acl,permission){acl.togglePermission(permission)},$scope.shareWith=function(shareWith){if($scope.inputSharedWith=[],shareWith.length>0)for(var i=0;i<shareWith.length;i++){for(var obj={userId:shareWith[i].uid,displayName:shareWith[i].text,type:shareWith[i].type,acl:angular.copy($scope.default_permissions),pending:!0,credential_guid:$scope.storedCredential.guid},found=!1,z=0;z<$scope.share_settings.credentialSharedWithUserAndGroup.length;z++)$scope.share_settings.credentialSharedWithUserAndGroup[z].userId===shareWith[z].uid&&(found=!0);found===!1&&$scope.share_settings.credentialSharedWithUserAndGroup.push(obj)}},$scope.unshareUser=function(user){ShareService.unshareCredentialFromUser($scope.storedCredential,user.userId).then(function(result){if(result.result===!0){var idx=$scope.share_settings.credentialSharedWithUserAndGroup.indexOf(user);$scope.share_settings.credentialSharedWithUserAndGroup.splice(idx,1)}})},$scope.unshareCredential=function(credential){ShareService.unshareCredential(credential);var _credential=angular.copy(credential),old_key=EncryptService.decryptString(angular.copy(_credential.shared_key)),new_key=VaultService.getActiveVault().vaultKey;_credential.shared_key=null,_credential.unshare_action=!0,_credential.skip_revision=!0,_credential=CredentialService.encryptCredential(_credential,old_key),CredentialService.updateCredential(_credential,!0).then(function(){NotificationService.showNotification($translate.instant("credential.unshared"),4e3),CredentialService.reencryptCredential(_credential.guid,old_key,new_key).then(function(){getAcl()})})},$scope.applyShareToUser=function(user,enc_key){ShareService.getVaultsByUser(user.userId).then(function(data){$scope.share_settings.cypher_progress.total+=data.length,user.vaults=data;var start=(new Date).getTime()/1e3;ShareService.cypherRSAStringWithPublicKeyBulkAsync(user.vaults,enc_key).progress(function(){$scope.share_settings.cypher_progress.done++,$scope.share_settings.cypher_progress.percent=$scope.share_settings.cypher_progress.done/$scope.share_settings.cypher_progress.total*100,$scope.$digest()}).then(function(result){$scope.share_settings.cypher_progress.times.push({time:(new Date).getTime()/1e3-start,user:data[0].user_id}),user.vaults=result,user.hasOwnProperty("acl_id")||$scope.uploadChanges(user),$scope.$digest()})})},$scope.$on("$locationChangeStart",function(event){$scope.sharing_complete||confirm($translate.instant("share.navigate.away.warning"))||event.preventDefault()});var getShareLink=function(hash){var port,defaultPort="http"===$location.$$protocol?80:443;return port=defaultPort!==$location.$$port?":"+$location.$$port:"",$location.$$protocol+"://"+$location.$$host+port+OC.generateUrl("apps/passman/share/public#")+hash};$scope.sharing_complete=!0,$scope.applyShare=function(){if($scope.sharing_complete=!1,$scope.share_settings.cypher_progress.percent=0,$scope.share_settings.cypher_progress.done=0,$scope.share_settings.cypher_progress.total=0,$scope.share_settings.cypher_progress.times=[],$scope.share_settings.cypher_progress.times_total=[],$scope.share_settings.upload_progress.done=0,$scope.share_settings.upload_progress.total=0,$scope.storedCredential.shared_key&&""!==$scope.storedCredential.shared_key&&null!==$scope.storedCredential.shared_key){var enc_key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key));if($scope.share_settings.linkSharing.enabled){var expire_time=new Date(angular.copy($scope.share_settings.linkSharing.settings.expire_time)).getTime()/1e3,shareObj={item_id:$scope.storedCredential.credential_id,item_guid:$scope.storedCredential.guid,permissions:$scope.share_settings.linkSharing.settings.acl.getAccessLevel(),expire_timestamp:expire_time,expire_views:$scope.share_settings.linkSharing.settings.expire_views};ShareService.createPublicSharedCredential(shareObj).then(function(){var hash=window.btoa($scope.storedCredential.guid+"<::>"+enc_key);$scope.share_link=getShareLink(hash)})}for(var list=$scope.share_settings.credentialSharedWithUserAndGroup,i=0;i<list.length;i++){var iterator=i,target_user=list[i];if(target_user.hasOwnProperty("created")){var acl={user_id:target_user.userId,permission:target_user.acl.getAccessLevel()};ShareService.updateCredentialAcl($scope.storedCredential,acl)}else $scope.applyShareToUser(list[iterator],enc_key)}NotificationService.showNotification($translate.instant("saved"),4e3),$scope.sharing_complete=!0}else ShareService.generateSharedKey(20).then(function(key){var encryptedSharedCredential=angular.copy($scope.storedCredential),old_key=VaultService.getActiveVault().vaultKey;CredentialService.reencryptCredential(encryptedSharedCredential.guid,old_key,key).progress(function(){}).then(function(data){var _credential=data.cryptogram;_credential.set_share_key=!0,_credential.skip_revision=!0,_credential.shared_key=EncryptService.encryptString(key),CredentialService.updateCredential(_credential,!0).then(function(){NotificationService.showNotification($translate.instant("credential.shared"),4e3),$scope.sharing_complete=!0})});for(var list=$scope.share_settings.credentialSharedWithUserAndGroup,i=0;i<list.length;i++)"user"===list[i].type&&$scope.applyShareToUser(list[i],key);if($scope.share_settings.linkSharing.enabled){var expire_time=new Date(angular.copy($scope.share_settings.linkSharing.settings.expire_time)).getTime()/1e3,shareObj={item_id:$scope.storedCredential.credential_id,item_guid:$scope.storedCredential.guid,permissions:$scope.share_settings.linkSharing.settings.acl.getAccessLevel(),expire_timestamp:expire_time,expire_views:$scope.share_settings.linkSharing.settings.expire_views};ShareService.createPublicSharedCredential(shareObj).then(function(){var hash=window.btoa($scope.storedCredential.guid+"<::>"+key);$scope.share_link=getShareLink(hash)})}})},$scope.uploadChanges=function(user){$scope.share_settings.upload_progress.total++,user.accessLevel=angular.copy(user.acl.getAccessLevel()),ShareService.shareWithUser(storedCredential,user).then(function(){$scope.share_settings.upload_progress.done++,$scope.share_settings.upload_progress.percent=$scope.share_settings.upload_progress.done/$scope.share_settings.upload_progress.total*100})},$scope.calculate_total_time=function(){$scope.share_settings.cypher_progress.times=$scope.share_settings.cypher_progress.times||[];for(var total=0,i=0;i<$scope.share_settings.cypher_progress.times.length;i++)total+=$scope.share_settings.cypher_progress.times[i].time;return total}}])}(),function(){angular.module("passmanApp").controller("SharingSettingsCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","ShareService","EncryptService",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,ShareService,EncryptService){$scope.active_vault=VaultService.getActiveVault(),$scope.sharing_keys=angular.copy(ShareService.getSharingKeys()),$scope.progress=1,$scope.generating=!1,$scope.available_sizes=[{size:1024,name:1024},{size:2048,name:2048},{size:4096,name:4096}],$scope.setKeySize=function(size){for(var i=0;i<$scope.available_sizes.length;i++)if($scope.available_sizes[i].size===size)return void($scope.key_size=$scope.available_sizes[i])},$scope.setKeySize(2048),$scope.generateKeys=function(length){$scope.progress=1,$scope.generating=!0,ShareService.generateRSAKeys(length).progress(function(progress){$scope.progress=progress>0?2:1,$scope.$digest()}).then(function(kp){$scope.generating=!1;var pem=ShareService.rsaKeyPairToPEM(kp);$scope.active_vault.private_sharing_key=EncryptService.encryptString(pem.privateKey),$scope.active_vault.public_sharing_key=pem.publicKey,VaultService.updateSharingKeys($scope.active_vault).then(function(){$scope.sharing_keys=ShareService.getSharingKeys()})})},$scope.updateSharingKeys=function(){$scope.active_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),$scope.active_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),VaultService.updateSharingKeys($scope.active_vault).then(function(){$scope.sharing_keys=ShareService.getSharingKeys()})}}])}(),function(){angular.module("passmanApp").controller("VaultCtrl",["$scope","VaultService","SettingsService","CredentialService","$location","ShareService","EncryptService","$translate","$rootScope",function($scope,VaultService,SettingsService,CredentialService,$location,ShareService,EncryptService,$translate,$rootScope){VaultService.getVaults().then(function(vaults){if($scope.vaults=vaults,null!=SettingsService.getSetting("defaultVault"))for(var default_vault=SettingsService.getSetting("defaultVault"),i=0;i<vaults.length;i++){var vault=vaults[i];if(vault.guid===default_vault.guid){$scope.default_vault=!0,$scope.list_selected_vault=vault,SettingsService.setSetting("defaultVault",vault),SettingsService.getSetting("defaultVaultPass")&&$location.path("/vault/"+vault.guid);break}}});var key_strengths=["password.poor","password.poor","password.weak","password.good","password.strong"];$scope.default_vault=!1,$scope.remember_vault_password=!1,$scope.auto_logout_timer=!1,$scope.logout_timer="0",$scope.list_selected_vault=!1,$scope.minimal_value_key_strength=3;var settingsLoaded=function(){$scope.minimal_value_key_strength=SettingsService.getSetting("vault_key_strength"),$translate(key_strengths[SettingsService.getSetting("vault_key_strength")]).then(function(translation){$scope.required_score={strength:translation}})};SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.toggleDefaultVault=function(){$scope.default_vault=!$scope.default_vault,$scope.default_vault===!0?SettingsService.setSetting("defaultVault",$scope.list_selected_vault):SettingsService.setSetting("defaultVault",null)},$scope.toggleRememberPassword=function(){$scope.remember_vault_password=!$scope.remember_vault_password,$scope.remember_vault_password&&(SettingsService.setSetting("defaultVault",$scope.list_selected_vault),$scope.default_vault=!0),$scope.remember_vault_password!==!0&&SettingsService.setSetting("defaultVault",null)},$scope.toggleAutoLogout=function(){$scope.auto_logout_timer=!$scope.auto_logout_timer},$scope.clearState=function(){$scope.list_selected_vault=!1,$scope.creating_vault=!1,$scope.error=!1},$scope.selectVault=function(vault){$scope.list_selected_vault=vault},$scope.sharing_keys={},$scope.newVault=function(){$scope.creating_vault=!0;var key_size=1024;ShareService.generateRSAKeys(key_size).progress(function(progress){var p=progress>0?2:1,msg=$translate.instant("generating.sharing.keys");msg=msg.replace("%step",p),$scope.creating_keys=msg,$scope.$digest()}).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.sharing_keys.private_sharing_key=pem.privateKey,$scope.sharing_keys.public_sharing_key=pem.publicKey,$scope.$digest()})};var _loginToVault=function(vault,vault_key){var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),delete _vault.credentials;var timer=parseInt($scope.logout_timer);$scope.auto_logout_timer&&timer>0&&$rootScope.$broadcast("logout_timer_set",60*timer),VaultService.setActiveVault(_vault),$location.path("/vault/"+vault.guid)};$scope.selectLogoutTimer=function(time){$scope.auto_logout_timer=!0,$scope.logout_timer=time},$scope.vaultDecryptionKey="",$scope.loginToVault=function(vault,vault_key){$scope.error=!1;var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);try{EncryptService.decryptString(vault.challenge_password),$scope.remember_vault_password&&SettingsService.setSetting("defaultVaultPass",vault_key),_loginToVault(vault,vault_key)}catch(e){$scope.error=$translate.instant("invalid.vault.key")}},$scope.createVault=function(vault_name,vault_key,vault_key2){return vault_key!==vault_key2?void($scope.error=$translate.instant("password.do.not.match")):void VaultService.createVault(vault_name).then(function(vault){$scope.vaults.push(vault);var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault),SettingsService.setSetting("defaultVaultPass",null),SettingsService.setSetting("defaultVault",null);var test_credential=CredentialService.newCredential();test_credential.label="Test key for vault "+vault_name,test_credential.hidden=!0,test_credential.vault_id=vault.vault_id,test_credential.password="lorum ipsum",CredentialService.createCredential(test_credential).then(function(){_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),VaultService.updateSharingKeys(_vault).then(function(){_loginToVault(vault,vault_key)})})})}}])}(),angular.module("templates-main",["views/credential_revisions.html","views/edit_credential.html","views/partials/forms/edit_credential/basics.html","views/partials/forms/edit_credential/custom_fields.html","views/partials/forms/edit_credential/files.html","views/partials/forms/edit_credential/otp.html","views/partials/forms/edit_credential/password.html","views/partials/forms/settings/export.html","views/partials/forms/settings/general_settings.html","views/partials/forms/settings/import.html","views/partials/forms/settings/password_settings.html","views/partials/forms/settings/sharing.html","views/partials/forms/settings/tool.html","views/partials/forms/share_credential/basics.html","views/partials/forms/share_credential/link_sharing.html","views/partials/password-meter.html","views/settings.html","views/share_credential.html","views/show_vault.html","views/vaults.html"]),angular.module("views/credential_revisions.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/credential_revisions.html",'<div id="controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'showing.revisions\' | translate}} "{{storedCredential.label}}"</a></div></div></div></div><div off-click="closeSelected()"><table class="credential-table" ng-init="menuOpen = false;"><tr ng-repeat="revision in revisions | orderBy:\'-created\'" ng-click="selectRevision(revision)" ng-class="{\'selected\': selectedRevision.revision_id == revision.revision_id}"><td><span class="icon"><i class="fa fa-lock"></i></span> <span class="label">{{ \'revision.of\' | translate}} {{revision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} ({{revision.credential_data.label}}) <span ng-if="revision.edited_by">{{ \'revision.edited.by\' | translate}} {{revision.edited_by}}</span></span></td></tr><tr ng-show="revisions.length == 0"><td>{{ \'no.revisions\' | translate}}</td></tr></table><div id="app-sidebar" class="detailsView scroll-container app_sidebar" ng-show="selectedRevision"><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span> <b ng-show="selectedRevision">{{ \'revision.of\' | translate}} {{selectedRevision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</b><div class="credential-data"><div class="row" ng-show="selectedRevision.credential_data.label"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'label\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.label"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.username"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'account\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.username"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.password"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'password\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.password" secret="\'true\'"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.otp.secret"><div class="col-xs-4 col-md-3 col-lg-3">{{\'otp\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator secret="selectedRevision.credential_data.otp.secret"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.email"><div class="col-xs-4 col-md-3 col-lg-3">{{\'email\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.email"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.url"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'url\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.url"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.description"><div class="col-xs-4 col-md-3 col-lg-3">{{\'notes\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.description_html"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.files.length > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'files\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in selectedRevision.credential_data.files" class="link" ng-click="downloadFile(selectedRevision.credential_data, file)">{{file.filename}} ({{file.size | bytes}})</div></div></div><div class="row" ng-repeat="field in selectedRevision.credential_data.custom_fields"><div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== \'file\' || !field.field_type"></span> <span ng-if="field.field_type === \'file\'" class="link" ng-click="downloadFile(selectedCredential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span></div></div><div class="row" ng-show="selectedRevision.credential_data.expire_time > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'expire.time\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedRevision.credential_data.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedRevision.credential_data.changed"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'changed\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedRevision.credential_data.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedRevision.credential_data.created"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'created\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedRevision.credential_data.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row"><div class="col-xs-12"><div class="tags"><span class="tag" ng-repeat="tag in selectedRevision.credential_data.tags">{{tag.text}}</span></div></div></div></div><div ng-show="selectedRevision"><button class="button" ng-click="restoreRevision(selectedRevision)"><span class="fa fa-edit"></span> {{ \'restore.revision\' | translate}}</button> <button class="button" ng-click="deleteRevision(selectedRevision)"><span class="fa fa-trash"></span> {{ \'delete.revision\' | translate}}</button></div></div></div>')}]),angular.module("views/edit_credential.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/edit_credential.html",'<div id="controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'edit.credential\' | translate}} "{{storedCredential.label}}"</a> <a ng-if="!storedCredential.credential_id">{{ \'create.credential\' | translate}}</a></div></div></div></div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="{active:isActiveTab(tab)}" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container edit_credential" use-theme type="\'border-top-color\'"><div ng-include="currentTab.url"></div><button ng-click="saveCredential()">{{ \'save\' | translate}}</button> <button ng-click="cancel()">{{ \'cancel\' | translate}}</button></div>')}]),angular.module("views/partials/forms/edit_credential/basics.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/basics.html",'<div class="row"><div class="col-xs-12 col-md-6"><label>{{ \'label\' | translate}}</label><div><input type="text" ng-model="storedCredential.label"></div><label>{{ \'username\' | translate}}</label><div><input type="text" ng-model="storedCredential.username"></div><label>{{ \'email\' | translate}}</label><div><input type="text" ng-model="storedCredential.email"></div><label>{{ \'password\' | translate}}</label><div><password-gen ng-model="storedCredential.password" settings="pwSettings" callback="pwGenerated"></password-gen><ng-password-meter password="storedCredential.password"></ng-password-meter></div><div><label>{{ \'password.r\' | translate}}</label><input type="password" ng-model="storedCredential.password_repeat"></div><label>{{ \'url\' | translate}}</label><div><input type="text" ng-model="storedCredential.url"></div></div><div class="col-xs-12 col-md-6"><label>{{ \'notes\' | translate}}</label><div><textarea class="credential_textarea" ng-model="storedCredential.description"></textarea></div><label>{{ \'add.tag\' | translate}}</label><div class="tags_input"><tags-input ng-model="storedCredential.tags" replace-spaces-with-dashes="false"><auto-complete source="getTags($query)" min-length="0"></auto-complete></tags-input></div></div></div>');
+}]),angular.module("views/partials/forms/edit_credential/custom_fields.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/custom_fields.html",'<div class="row"><div class="col-xs-12 col-md-4"><label>{{ \'field.label\' | translate}}</label><input type="text" ng-model="new_custom_field.label"></div><div class="col-xs-10 col-md-6 field-value"><div class="row"><div class="col-xs-12"><label>{{ \'field.value\' | translate}}</label></div></div><div class="row"><div class="col-xs-8 valueInput"><input type="text" ng-model="new_custom_field.value" ng-show="new_custom_field.field_type === \'text\'"><password-gen ng-model="new_custom_field.value" ng-show="new_custom_field.field_type ===\'password\'" settings="{generateOnCreate: false }"></password-gen><span ng-show="new_custom_field.field_type ===\'file\'"><input id="custom_field_file" class="inputfile" type="file" file-select success="addFileToCustomField" error="fileLoadError" progress="fileSelectProgress"><label for="custom_field_file"><i class="fa fa-upload" aria-hidden="true"></i> {{ new_custom_field.value.filename || \'select.file\' | translate}}</label></span></div><div class="col-xs-4 selectType"><select class="form-control" ng-model="new_custom_field.field_type"><option value="text">{{ \'text\' | translate}}</option><option value="password">{{ \'password\' | translate}}</option><option value="file">{{ \'file\' | translate}}</option></select></div></div><div class="row"><div class="col-xs-12"><ng-password-meter ng-if="new_custom_field.field_type ===\'password\'" password="new_custom_field.value"></ng-password-meter></div></div></div><div class="col-xs-2 col-md-2"><label class="invisible">{{\'add\' | translate}}</label><button ng-click="addCustomField()">+</button></div></div><div class="row custom_fields" ng-if="storedCredential.custom_fields.length > 0"><div class="col-xs-12 table"><table><thead><tr use-theme><td class="dragger"></td><th class="field_label">{{ \'label\' | translate}}</th><th class="field_value">{{ \'value\' | translate}}</th><th class="field_secret">{{ \'type\' | translate}}</th><th class="field_actions">{{ \'actions\' | translate}}</th></tr></thead><tbody ui-sortable ng-model="storedCredential.custom_fields"><tr ng-repeat="field in storedCredential.custom_fields"><td class="dragger"><i class="fa fa-arrows-v"></i></td><td><a href="#" editable-text="field.label">{{ field.label || "empty" }}</a></td><td><span ng-if="field.field_type === \'text\'"><a href="#" editable-text="field.value">{{ field.value || \'empty\' | translate }}</a></span> <span ng-if="field.field_type === \'password\'"><a href="#" editable-password="field.value"><span ng-repeat="n in [] | range:field.value.length">*</span></a></span> <span ng-if="field.field_type === \'file\'">{{field.value.filename}} ({{field.value.size | bytes}})</span></td><td>{{ field.field_type }}</td><td class="field_actions"><i class="fa fa-trash" ng-click="deleteCustomField(field)"></i></td></tr></tbody></table></div></div>')}]),angular.module("views/partials/forms/edit_credential/files.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/files.html",'<div class="row file_tab"><div class="col-xs-12 col-md-6"><input class="inputfile" id="file" type="file" file-select success="fileLoaded" error="fileLoadError" progress="fileSelectProgress"><label for="file"><i class="fa fa-upload" aria-hidden="true"></i> {{\'select.file\' | translate}}</label><span ng-if="fileprogress.file_percent > 0"><div progress-bar="fileprogress.file_percent"></div></span></div></div><div class="row files" ng-if="storedCredential.files.length > 0"><div class="col-xs-12 table"><table><thead use-theme><tr><th class="field_label">{{ \'file.name\' | translate }}</th><th class="field_value">{{ \'upload.date\' | translate}}</th><th class="field_secret">{{ \'size\' | translate}}</th><th class="field_actions">{{ \'actions\' | translate}}</th></tr></thead><tr ng-repeat="file in storedCredential.files"><td><a href="#" editable-text="file.filename">{{ file.filename || "empty" }}</a></td><td>{{file.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td><td>{{file.size | bytes}}</td><td class="field_actions"><i class="fa fa-trash" ng-click="deleteFile(file)"></i></td></tr></table></div></div>')}]),angular.module("views/partials/forms/edit_credential/otp.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/otp.html",'<div class="row"><div class="col-xs-12"><div class="col-xs-2 nopadding">{{ \'upload.qr\' | translate}}</div><div class="col-xs-6 nopadding"><input type="file" qrread on-read="parseQR(qrdata)" class="input_secret" on-read="parseQR(qrdata)"></div></div></div><div class="row"><div class="col-xs-12" ng-if="storedCredential.otp">{{ \'current.qr\' | translate}}</div></div><div class="row"><div class="col-xs-5 col-sm-4 col-md-2" ng-if="storedCredential.otp.qr_uri"><img ng-src="{{storedCredential.otp.qr_uri.image}}"></div><div class="col-sm-4 col-sm-5 col-md-5"><table ng-show="storedCredential.otp"><tr ng-show="storedCredential.otp.type"><td>{{ \'type\' | translate}}:</td><td>{{storedCredential.otp.type}}</td></tr><tr ng-show="storedCredential.otp.label"><td>{{ \'label\' | translate}}:</td><td>{{storedCredential.otp.label}}</td></tr><tr ng-show="storedCredential.otp.issuer"><td>{{ \'issuer\' | translate}}:</td><td>{{storedCredential.otp.issuer}}</td></tr><tr ng-show="storedCredential.otp.secret"><td>{{ \'secret\' | translate}}:</td><td>{{storedCredential.otp.secret}}</td></tr><tr ng-show="storedCredential.otp.secret"><td>{{ \'otp\' | translate}}:</td><td><span otp-generator secret="storedCredential.otp.secret"></span></td></tr></table></div></div>')}]),angular.module("views/partials/forms/edit_credential/password.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/password.html",'<div class="row"><div class="col-xs-12 col-md-5 col-lg-5"><label>{{ \'password\' | translate}}</label><div><password-gen ng-model="storedCredential.password" settings="pwSettings" callback="pwGenerated"></password-gen><ng-password-meter password="storedCredential.password"></ng-password-meter></div><label>{{ \'password.r\' | translate}}</label><div><input type="password" ng-model="storedCredential.password_repeat"></div><label>{{ \'expire.date\' | translate}}</label><div><span datetime-picker ng-model="storedCredential.expire_time" class="link" future-only ng-show="storedCredential.expire_time == 0" close-on-select="false">{{\'no.expire.date\' | translate}}</span> <span datetime-picker ng-model="storedCredential.expire_time" class="link" future-only ng-show="storedCredential.expire_time != 0" close-on-select="false">{{ storedCredential.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span></div><label>{{ \'renew.interval\' | translate}}</label><div><input type="number" ng-model="renewIntervalValue" min="0" ng-change="updateInterval(renewIntervalValue, renewIntervalModifier)"><select ng-model="renewIntervalModifier" ng-change="updateInterval(renewIntervalValue, renewIntervalModifier)"><option value="0">{{ \'disabled\' | translate}}</option><option value="86400">{{ \'days\' | translate }}</option><option value="604800">{{ \'weeks\' | translate}}</option><option value="2592000">{{ \'months\' | translate}}</option><option value="31622400">{{ \'years\' | translate}}</option></select></div></div><div class="col-xs-12 col-md-7 col-lg-7"><b>{{ \'generation.settings\' | translate}}</b><div class="row"><div class="password_settings"><div class="col-xs-12 col-sm-5 col-lg-4"><label><span class="label">{{ \'password.generation.length\' | translate}}</span><br><input type="number" ng-model="pwSettings.length" min="1"></label><label><span class="label">{{\'password.generation.min_digits\' | translate}}</span><br><input type="number" ng-model="pwSettings.minimumDigitCount" min="0"></label></div><div class="col-xs-12 col-sm-6 col-lg-6"><label><input type="checkbox" ng-model="pwSettings.useUppercase"> <span class="label sm">{{ \'password.generation.uppercase\' | translate}}</span></label><label><input ng-model="pwSettings.useLowercase" type="checkbox" id="lower"> <span class="label sm">{{ \'password.generation.lowercase\' | translate}}</span></label><label><input ng-model="pwSettings.useDigits" type="checkbox" id="digits"> <span class="label sm">{{ \'password.generation.digits\' | translate}}</span></label><label><input type="checkbox" id="special" ng-model="pwSettings.useSpecialChars"> <span class="label sm">{{ \'password.generation.special\' | translate}}</span></label><label><input type="checkbox" id="ambig" ng-model="pwSettings.avoidAmbiguousCharacters"> <span class="label sm">{{ \'password.generation.ambiguous\' | translate}}</span></label><label><input type="checkbox" ng-model="pwSettings.requireEveryCharType" id="reqevery"> <span class="label sm">{{ \'password.generation.require_same\' | translate}}</span></label></div></div></div></div></div>')}]),angular.module("views/partials/forms/settings/export.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/export.html",'<div ng-controller="ExportCtrl"><div class="row"><div class="col-xs-6"><label>{{ \'export.type\' | translate}}<select ng-init="raw" ng-model="raw" ng-change="setExporter(raw)"><option ng-repeat="exporter in available_exporters" value="{{exporter}}">{{exporter.name}}</option></select></label><div><b>{{selectedExporter.description}}</b></div><button class="button" ng-click="startExport()" ng-if="selectedExporter">{{ \'export\' | translate}}</button></div><div class="col-xs-6"><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div></div>')}]),angular.module("views/partials/forms/settings/general_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/general_settings.html",'<div class="row"><div class="col-xs-12 col-md-6"><h3>{{ \'rename.vault\' | translate}}</h3><label>{{ \'rename.vault.name\' | translate}}</label><input type="text" ng-model="$parent.new_vault_name"> <button ng-click="saveVaultSettings()">{{ \'change\' | translate}}</button><h3>{{ \'change.vault.key\' | translate}}</h3><label>{{ \'old.vault.password\' | translate}}</label><input type="password" ng-model="oldVaultPass"><label>{{ \'new.vault.password\' | translate}}</label><password-gen ng-model="newVaultPass"></password-gen><ng-password-meter password="newVaultPass"></ng-password-meter><label>{{ \'new.vault.pw.r\' | translate}}</label><input type="password" ng-model="newVaultPass2"><div ng-show="error" class="error"><ul><li>{{error}}</li></ul></div><button ng-click="changeVaultPassword(oldVaultPass,newVaultPass,newVaultPass2)">{{ \'change\' | translate}}</button><div ng-show="change_pw.total > 0">{{\'warning.leave\' | translate}}<br>{{ \'processing\' | translate}} {{cur_state.process}}<div progress-bar="cur_state.calculated" index="cur_state.current" total="cur_state.total"></div>{{ \'total.progress\' | translate}}<div progress-bar="change_pw.percent" index="change_pw.done" total="change_pw.total"></div></div><h3>{{\'delete.vault\' | translate}}</h3><b>{{ \'vault.remove.notice\' | translate }}</b><label>{{\'vault.password\' | translate}}</label><input type="password" ng-model="$parent.delete_vault_password"> <input type="checkbox" ng-model="$parent.confirm_vault_delete"> {{\'delete.vault.checkbox\' | translate}}<br><button class="btn btn-danger" ng-click="delete_vault()">{{\'delete.vault.confirm\' | translate}}</button><div ng-show="remove_pw">{{\'deleting.pw\' | translate:translationData}}<div progress-bar="remove_pw.percent" index="remove_pw.done" total="remove_pw.total"></div></div></div><div class="col-xs-12 col-md-6"><h3>{{ \'about.passman\' | translate}}</h3><p>{{ \'version\' | translate}}: <b>{{passman_version}}</b><br><br><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6YS8F97PETVU2" target="_blank" class="link">{{ \'donate.support\' | translate}}</a><br></p><h3>{{ \'bookmarklet\' | translate}}</h3><div><p>{{ \'bookmarklet.info1\' | translate}}<br>{{ \'bookmarklet.info2\' | translate}}<br></p></div><div><p ng-bind-html="bookmarklet" style="margin-top: 5px"></p></div></div></div>')}]),angular.module("views/partials/forms/settings/import.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/import.html",'<div ng-controller="ImportCtrl"><div class="row"><div class="col-xs-6"><label>{{ \'import.type\' | translate}}<select ng-init="importerType" ng-model="importerType" ng-change="setImporter(importerType)"><option ng-repeat="importer in available_importers" value="{{importer}}">{{importer.name}}</option></select></label><div><b>{{selectedImporter.description}}</b></div><input ng-if="selectedImporter" type="file" file-select success="fileLoaded" error="fileLoadError" progress="fileSelectProgress"><br><button class="button" ng-click="startImport()" ng-if="selectedImporter">{{ \'import\' | translate}}</button><div ng-if="file_read_progress.percent > 0">{{ \'read.progress\' | translate}}<div progress-bar="file_read_progress.percent" index="file_read_progress.loaded" total="file_read_progress.total"></div></div><div ng-if="import_progress.progress > 0">{{ \'upload.progress\' | translate}}<div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div></div></div><div class="col-xs-6"><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div></div>')}]),angular.module("views/partials/forms/settings/password_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/password_settings.html",'<div class="password_settings"><div class="col-xs-12 col-sm-5 col-lg-4"><label><span class="label">{{ \'password.generation.length\' | translate}}</span><br><input type="number" ng-model="vault_settings.pwSettings.length" min="1"></label><label><span class="label">{{ \'password.generation.min_digits\' | translate}}</span><br><input type="number" ng-model="vault_settings.pwSettings.minimumDigitCount" min="0"></label><label><span class="label">Generate password on creation</span><br><input type="checkbox" ng-model="vault_settings.pwSettings.generateOnCreate" min="0"></label></div><div class="col-xs-12 col-sm-6 col-lg-6"><label><input type="checkbox" ng-model="vault_settings.pwSettings.useUppercase"> <span class="label sm">{{ \'password.generation.uppercase\' | translate}}</span></label><label><input ng-model="vault_settings.pwSettings.useLowercase" type="checkbox" id="lower"> <span class="label sm">{{ \'password.generation.lowercase\' | translate}}</span></label><label><input ng-model="vault_settings.pwSettings.useDigits" type="checkbox" id="digits"> <span class="label sm">{{ \'password.generation.digits\' | translate}}</span></label><label><input type="checkbox" id="special" ng-model="vault_settings.pwSettings.useSpecialChars"> <span class="label sm">{{ \'password.generation.special\' | translate}}</span></label><label><input type="checkbox" id="ambig" ng-model="vault_settings.pwSettings.avoidAmbiguousCharacters"> <span class="label sm">{{ \'password.generation.ambiguous\' | translate}}</span></label><label><input type="checkbox" ng-model="vault_settings.pwSettings.requireEveryCharType" id="reqevery"> <span class="label sm">{{ \'password.generation.require_same\' | translate}}</span></label></div></div><div class="row"><div class="col-xs-12"><button class="button" ng-click="saveVaultSettings()">{{ \'save\' | translate}}</button></div></div>')}]),angular.module("views/partials/forms/settings/sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/sharing.html",'<div ng-controller="SharingSettingsCtrl"><div class="row"><div class="col-md-6"><label>{{ \'priv.key\' | translate}}</label><textarea class="col-md-12">{{sharing_keys.private_sharing_key}}</textarea></div><div class="col-md-6"><label>{{ \'pub.key\' | translate}}</label><textarea class="col-md-12">{{sharing_keys.public_sharing_key}}</textarea></div></div><div class="row"><div class="col-md-12"><label>{{ \'key.size\' | translate}}<select ng-model="key_size" ng-options="size.name for size in available_sizes"></select><button ng-click="updateSharingKeys()"><i class="fa fa-fa-floppy-o"></i> {{ \'save.keys\' | translate}}</button> <button ng-if="!generating" ng-click="generateKeys(key_size.size)">{{ \'gen.keys\' | translate}}</button> <button ng-if="generating"><i class="fa fa-spinner fa-spin"></i> {{ \'generating.keys\' | translate}} ({{progress}}/2)</button></label></div></div></div>')}]),angular.module("views/partials/forms/settings/tool.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/tool.html",'<div class="row"><div class="col-xs-12"><p>{{ \'tool.intro\' | translate}}</p></div><div class="col-xs-12" ng-init="minStrength = 3;">{{ \'min.strength\' | translate}} <input type="number" min="1" max="4" value="3" ng-model="minStrength"> <button ng-click="startScan(minStrength)">Start scan</button></div></div><div class="row" ng-show="scan_result"><div class="col-xs-12"><p>{{ \'scan.result.msg\' | translate}}<br><span translate="scan.result" translate-values="{ scan_result: scan_result.length}"></span><br></p><table class="table scan-result-table"><thead><tr><td>{{ \'label\' | translate}}</td><td>{{ \'score\' | translate}}</td><td>{{ \'password\' | translate}}</td><td>{{ \'action\' | translate}}</td></tr></thead><tbody><tr ng-repeat="result in scan_result | orderBy:\'password_zxcvbn_result.score\'"><td>{{result.label}}</td><td class="score"><ng-password-meter password="result.password"></ng-password-meter></td><td><span credential-field value="result.password" secret="\'true\'"></span></td><td><a class="link" ng-href="#/vault/{{active_vault.vault_id}}/edit/{{result.credential_id}}" tooltip="\'Edit credential\'"><i class="fa fa-edit"></i></a></td></tr></tbody></table></div></div>')}]),angular.module("views/partials/forms/share_credential/basics.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/basics.html",'<div class="row"><div class="col-xs-12 col-md-6"><div><table class="table sharing_table"><thead><tr><td><tags-input ng-model="inputSharedWith" replace-spaces-with-dashes="false" add-from-autocomplete-only="true" placeholder="{{ \'search.u.g\' | translate}}"><auto-complete source="searchUsers($query)" min-length="0" template="autocomplete-template"></auto-complete></tags-input></td><td><button class="button" ng-click="shareWith(inputSharedWith, selectedAccessLevel)">+</button></td></tr></thead></table><div ng-if="share_settings.cypher_progress.done > 0">{{\'cyphering\' | translate}}...<div progress-bar="share_settings.cypher_progress.percent" index="share_settings.cypher_progress.done" total="share_settings.cypher_progress.total"></div></div><div ng-if="share_settings.upload_progress.done > 0">{{ \'uploading\' | translate}}...<div progress-bar="share_settings.upload_progress.percent" index="share_settings.upload_progress.done" total="share_settings.upload_progress.total"></div></div></div></div><div class="col-xs-12 col-md-6" ng-show="share_settings.cypher_progress.times.length > 0"><table class="table"><thead><tr><td>{{ \'user\' | translate}}</td><td>{{ \'crypto.time\' | translate}}</td></tr></thead><tr ng-repeat="user in share_settings.cypher_progress.times"><td><i class="fa fa-cogs"></i> {{user.user}}</td><td>{{user.time}} s</td></tr></table>{{ \'crypto.total.time\' | translate}}: {{ calculate_total_time() }}</div></div><div class="row"><div class="col-xs-12 col-md-6"><table class="table shared_table" ng-show="share_settings.credentialSharedWithUserAndGroup.length > 0"><thead><tr><td>{{\'user\' | translate}}</td><td>{{ \'perm.read\' | translate}}</td><td>{{ \'perm.write\' | translate}}</td><td>{{ \'perm.files\' | translate}}</td><td>{{ \'perm.revisions\' | translate}}</td><td></td></tr></thead><tr ng-repeat="user in share_settings.credentialSharedWithUserAndGroup"><td><i class="fa fa-user" ng-if="user.pending === false"></i> <i class="fa fa-user-times" ng-if="user.pending === true"></i> {{user.userId}} <small ng-if="user.pending === true" class="pull-right col-xs-4">{{ \'pending\' | translate}}</small></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.READ)" ng-checked="hasPermission(user.acl, default_permissions.permissions.READ)"></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.WRITE)" ng-checked="hasPermission(user.acl, default_permissions.permissions.WRITE)"></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.FILES)" ng-checked="hasPermission(user.acl, default_permissions.permissions.FILES)"></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.HISTORY)" ng-checked="hasPermission(user.acl, default_permissions.permissions.HISTORY)"></td><td><i class="fa fa-trash" ng-click="unshareUser(user)"></i></td></tr></table></div></div><script type="text/ng-template" id="autocomplete-template"><i class="fa fa-user" ng-if="data.type === \'user\'"></i>\n\t<i class="fa fa-group" ng-if="data.type === \'group\'"></i>\n\t{{data.text}}</script>')}]),angular.module("views/partials/forms/share_credential/link_sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/link_sharing.html",'<div class="row"><div class="col-xs-12 col-md-6"><label><input type="checkbox" ng-model="share_settings.linkSharing.enabled"> {{ \'enable.link.sharing\' | translate}}.</label><br><input type="text" ng-model="share_link" select-on-click placeholder="{{ \'click.share\' | translate}}!" ng-if="share_settings.linkSharing.enabled"><div ng-show="share_settings.linkSharing.enabled">{{ \'share.until.date\' | translate}} <span datetime-picker ng-model="share_settings.linkSharing.settings.expire_time" class="link" future-only close-on-select="false" timestamp="true">{{ share_settings.linkSharing.settings.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\' }}</span></div><div ng-show="share_settings.linkSharing.enabled">{{ \'expire.views\' | translate}}<br><input type="number" ng-model="share_settings.linkSharing.settings.expire_views"></div><div ng-if="share_settings.linkSharing.enabled"><table><tr><td><input type="checkbox" ng-click="setPermission(share_settings.linkSharing.settings.acl, default_permissions.permissions.FILES)" ng-checked="hasPermission(share_settings.linkSharing.settings.acl, default_permissions.permissions.FILES)"></td><td>{{ \'show.files\' | translate}}</td></tr></table></div></div></div>')}]),angular.module("views/partials/password-meter.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/password-meter.html",'<div class="pass-meter {{masterClass}}" off-click="matchBreakdown = false;"><div class="{{colClass}} pass-meter-col {{first}}"><div class="indicator"></div></div><div class="{{colClass}} pass-meter-col {{second}}"><div class="indicator"></div></div><div class="{{colClass}} pass-meter-col {{third}}"><div class="indicator"></div></div><div class="{{colClass}} pass-meter-col {{fourth}}"><div class="indicator"></div></div><div class="details" ng-click="toggleScore()"><span ng-show="!scoreShown">{{ \'details\' | translate }}</span> <span ng-show="scoreShown">{{ \'hide.details\' | translate}}</span></div><div class="pass-meter-message">{{message}}</div><div class="detail_box" ng-show="scoreShown"><div class="row"><div class="col-xs-6">{{ \'password.score\' | translate}}:</div><div class="col-xs-6">{{score.score}}</div></div><div><b>{{ \'cracking.times\' | translate}}</b></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.100h\' | translate}}<br><small>{{ \'cracking.time.100h.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.online_throttling_100_per_hour}}</div></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.10s\' | translate}}<br><small>{{ \'cracking.time.10s.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.online_no_throttling_10_per_second}}</div></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.10ks\' | translate}}<br><small>{{ \'cracking.time.10ks.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.offline_slow_hashing_1e4_per_second}}</div></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.10Bs\' | translate}}<br><small>{{ \'cracking.time.10Bs.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.offline_fast_hashing_1e10_per_second}}</div></div><div class="row"><div class="col-xs-6">{{ \'match.sequence\' | translate}}:</div><div class="col-xs-6"><span class="link" ng-click="toggleMatchBreakdown()">{{ \'match.sequence.link\' | translate}}</span></div></div></div></div><div class="match-sequence"><div class="sequence_container" ng-style="{\'width\': score.sequence.length * 210 }"><div class="sequence" ng-repeat="sequence in score.sequence"><table><tr><td colspan="2" class="token"><code>{{sequence.token}}</code></td></tr><tr ng-if="sequence.pattern"><td>{{ \'pattern\' | translate}}</td><td>{{sequence.pattern}}</td></tr><tr ng-if="sequence.matched_word"><td>{{ \'matched.word\' | translate}}</td><td>{{sequence.matched_word}}</td></tr><tr ng-if="sequence.dictionary_name"><td>{{ \'dictionary.name\' | translate}}</td><td>{{sequence.dictionary_name}}</td></tr><tr ng-if="sequence.rank"><td>{{ \'rank\' | translate}}</td><td>{{sequence.rank}}</td></tr><tr ng-if="sequence.reversed"><td>{{ \'reversed\' | translate}}</td><td>{{sequence.reversed}}</td></tr><tr ng-if="sequence.guesses"><td>{{ \'guesses\' | translate}}</td><td>{{sequence.guesses}}</td></tr><tr ng-if="sequence.base_guesses"><td>{{ \'base.guesses\' | translate}}</td><td>{{sequence.base_guesses}}</td></tr><tr ng-if="sequence.uppercase_variations"><td>{{ \'uppercase.variations\' | translate}}</td><td>{{sequence.uppercase_variations}}</td></tr><tr ng-if="sequence.l33t_variations"><td>{{ \'leet.variations\' | translate}}</td><td>{{sequence.l33t_variations}}</td></tr></table></div></div></div>')}]),angular.module("views/settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/settings.html",'<div id="controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last"><a>{{ \'settings\' | translate}}</a></div></div></div></div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="{active:isActiveTab(tab)}" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container settings edit_credential"><div ng-include="currentTab.url"></div></div>')}]),angular.module("views/share_credential.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/share_credential.html",'<div id="controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'share.credential\' | translate}} {{storedCredential.label}}</a></div></div></div></div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="{active:isActiveTab(tab)}" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container share_credential" ng-show="currentTab"><div ng-include="currentTab.url"></div><button ng-click="applyShare()">{{ \'share\' | translate}}</button> <button ng-click="cancel()">{{ \'cancel\' | translate}}</button> <button class="btn btn-danger" ng-click="unshareCredential(storedCredential)">{{ \'unshare\' | translate}}</button></div>')}]),angular.module("views/show_vault.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/show_vault.html",'<div off-click="closeSelected()" off-click-filter="\'.download-js-link, .sidebar-shown\'"><div id="passman-controls" ng-class="{ \'sidebar-shown\': selectedCredential }"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a><i class="fa fa-home"></i></a></div><div class="crumb svg last"><a>{{active_vault.name}}</a></div></div></div><span class="title" ng-if="delete_time">{{ \'deleted.since\' | translate }}: <span ng-if="delete_time == 1">All time</span> <span ng-if="delete_time > 1">{{delete_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span></span><div class="actions creatable"><span ng-click="addCredential()" class="button new"><span>+</span></span></div><div class="title" ng-show="filtered_credentials.length > 0" translate="number.filtered" translate-values="{number_filtered: filtered_credentials.length, credential_number: active_vault.credentials.length - 1}"></div><div class="searchboxContainer" ng-init="filterOptionShown = false;" off-click="filterOptionShown = false;"><input type="text" ng-model="filterOptions.filterText" class="searchbox" id="searchBox" placeholder="{{\'search.credential\' | translate}}" select-on-click clear-btn ng-click="filterOptionShown = true;"><div class="searchOptions" ng-show="filterOptionShown"><input type="checkbox" ng-model="filterOptions.useRegex"> {{ \'use.regex\' | translate }}</div></div><div class="viewModes"><div class="view-mode" ng-class="{\'active\': view_mode === \'list\' }" ng-click="switchViewMode(\'list\')"><i class="fa fa-list"></i></div><div class="view-mode" ng-class="{\'active\': view_mode === \'grid\' }" ng-click="switchViewMode(\'grid\')"><i class="fa fa-th-large"></i></div></div></div><div class="loaderContainer" ng-if="show_spinner"><div class="loader" use-theme type="\'border-bottom-color\'"></div></div><div ng-init="menuOpen = false;"><table class="credential-table" ng-if="view_mode === \'list\'"><tr ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="showCredentialRow(credential)" ng-click="selectCredential(credential)" ng-dblclick="editCredential(credential)" ng-class="{\'selected\': selectedCredential.credential_id == credential.credential_id}"><td><span class="tags"><span class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</span></span> <span class="icon"><i class="fa fa-lock" ng-if="!credential.acl && !credential.shared_key"></i> <i class="fa fa-share-alt" ng-if="credential.acl"></i> <i class="fa fa-share-alt-square" ng-if="credential.shared_key"></i></span> <span class="label">{{ ::credential.label}}</span></td></tr></table><ul class="grid-view" ng-if="view_mode === \'grid\'"><li class="credential" ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="credential.hidden == 0 && showCredentialRow(credential)" ng-click="selectCredential(credential)" use-theme type="\'border-color\'"><div class="credential_content"><div class="label">{{ ::credential.label}}</div><div class="tags"><div class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</div></div></div></li></ul></div><div id="app-sidebar" class="detailsView scroll-container app_sidebar" ng-show="selectedCredential"><h2>{{selectedCredential.label}}</h2><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span><div class="credential-data"><div class="row" ng-show="selectedCredential.username"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'account\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.username"></span></div></div><div class="row" ng-show="selectedCredential.password"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'password\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.password" secret="\'true\'"></span></div></div><div class="row" ng-show="selectedCredential.otp.secret"><div class="col-xs-4 col-md-3 col-lg-3">{{\'otp\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator secret="selectedCredential.otp.secret"></span></div></div><div class="row" ng-show="selectedCredential.email"><div class="col-xs-4 col-md-3 col-lg-3">{{\'email\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.email"></span></div></div><div class="row" ng-show="selectedCredential.url"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'url\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.url"></span></div></div><div class="row" ng-show="selectedCredential.description"><div class="col-xs-4 col-md-3 col-lg-3">{{\'notes\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.description_html"></span></div></div><div class="row" ng-show="selectedCredential.files.length > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'files\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in selectedCredential.files" class="link" ng-click="downloadFile(selectedCredential, file)">{{file.filename}} ({{file.size | bytes}})</div></div></div><div class="row" ng-repeat="field in selectedCredential.custom_fields"><div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== \'file\' || !field.field_type"></span> <span ng-if="field.field_type === \'file\'" class="link" ng-click="downloadFile(selectedCredential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span></div></div><div class="row" ng-show="selectedCredential.expire_time > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'expire.time\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedCredential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedCredential.changed"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'changed\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedCredential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedCredential.created"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'created\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedCredential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row"><div class="col-xs-12"><div class="tags"><span class="tag" ng-repeat="tag in selectedCredential.tags">{{tag.text}}</span></div></div></div></div><div ng-show="selectedCredential"><div><button class="button" ng-click="editCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-edit"></span> {{ \'edit\' | translate}}</button> <button class="button" ng-click="deleteCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-trash"></span> {{ \'delete\' | translate}}</button> <button class="button" ng-click="shareCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && selectedCredential.acl === undefined &&\n\t\t\t\t\t\t(settings.user_sharing_enabled === 1 || settings.user_sharing_enabled === \'1\' || settings.link_sharing_enabled === 1 || settings.link_sharing_enabled === \'1\')"><span class="fa fa-share"></span> {{ \'share\' | translate}}</button> <button class="button" ng-click="getRevisions(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.HISTORY)"><span class="fa fa-undo"></span> {{ \'revisions\' | translate}}</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="recoverCredential(selectedCredential) && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-recycle"></span> {{\'recover\' | translate}}</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="destroyCredential(selectedCredential)"><span class="fa fa-bomb"></span> {{\'destroy\' | translate}}</button></div></div></div></div><div class="share_popup" style="display: none">{{ \'sharereq.title\' | translate}}<br>{{ \'sharereq.line1\' | translate}}<br>{{ \'sharereq.line2\' | translate}} {{active_vault.vault_id}}<table class="table"><thead><tr><td>{{ \'label\' | translate}}</td><td>{{ \'permissions\' | translate}}</td><td>{{ \'received.from\' | translate}}</td><td>{{ \'date\' | translate}}</td></tr></thead><tr ng-repeat="share_request in incoming_share_requests" ng-if="share_request.target_vault_id == active_vault.vault_id"><td>{{share_request.credential_label}}</td><td>{{share_request.permissions}}</td><td>{{share_request.from_user_id}}</td><td>{{share_request.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td><td><span class="link" ng-click="acceptShareRequest(share_request)">{{ \'accept\' | translate}}</span> | <span class="link" ng-click="declineShareRequest(share_request)">{{ \'decline\' | translate}}</span></td></tr></table></div>');
+}]),angular.module("views/vaults.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/vaults.html",'<div class="vault_wrapper"><div class="vaults" ng-if="!list_selected_vault && !creating_vault"><div class="ui-select-container ui-select-bootstrap vaultlist"><ul><li ng-click="newVault()">+ Create a new vault</li><li ng-repeat="vault in vaults" ng-class="{\'selected\': vault == list_selected_vault }" ng-click="selectVault(vault)"><div><span class="ui-select-choices-row-inner"><div class="ng-binding ng-scope">{{vault.name}}</div><small class="ng-binding ng-scope">{{ \'created\' | translate}}: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | {{ \'last.access\' | translate}}: <span ng-if="vault.last_access > 0">{{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span> <span ng-if="vault.last_access === 0">{{\'never\' | translate}}</span></small></span></div></li><li ng-if="vaults.length === 0">{{ \'no.vaults\' | translate}}</li></ul></div></div><div ng-if="creating_vault"><div class="login_form" ng-init="vault_name = \'\'; vault_key=\'\'; ">{{\'new.vault.name\' | translate}}<div><input type="text" ng-model="vault_name" required></div><div>{{ \'new.vault.pass\' | translate}} <input type="password" ng-model="vault_key" required><ng-password-meter password="vault_key" score="vault_key_score"></ng-password-meter></div><div>{{ \'new.vault.passr\' | translate}} <input type="password" ng-model="vault_key2" required></div><div ng-show="error || vault_key_score.score < minimal_value_key_strength" class="error"><ul><li ng-show="error">{{error}}</li><li ng-show="vault_key_score.score < minimal_value_key_strength">{{\'min.vault.key.strength\' | translate:required_score}}</li></ul></div><div><small>{{\'new.vault.sharing_key_notice\' | translate}}</small></div><div class="button_wrapper"><button class="button button-geen" ng-if="!creating_keys" ng-click="createVault(vault_name, vault_key, vault_key2)" ng-disabled="vault_key_score.score < minimal_value_key_strength || vault_key !== vault_key2 || vault_key === \'\'">{{ \'new.vault.create\' | translate }}</button><div class="button" ng-if="creating_keys"><span><i class="fa fa-spinner fa-spin"></i> {{creating_keys}}</span></div><div class="button button-red" ng-click="clearState()">{{ \'cancel\' | translate}}</div><div class="hidden">{{sharing_keys}}</div></div></div></div><div ng-if="list_selected_vault != false"><div class="vaultlist"><ul><li ng-click="clearState()">{{ \'go.back.vaults\' | translate }}</li></ul></div><div class="login_form"><div ng-show="error" class="error"><ul><li>{{error}}</li></ul></div>{{ \'input.vault.password\' | translate}} {{list_selected_vault.name}}<div class="pw-input"><input type="password" ng-model="vault_key" ng-enter="loginToVault(list_selected_vault, vault_key)"> <small class="last_access">{{\'last.access\' | translate}}: <span ng-if="list_selected_vault.last_access > 0">{{list_selected_vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span> <span ng-if="list_selected_vault.last_access === 0">Never</span></small></div><div><div><label><input type="checkbox" ng-checked="default_vault" ng-click="toggleDefaultVault()"> {{ \'vault.default\' | translate}}</label></div><div><label><input type="checkbox" ng-checked="remember_vault_password" ng-click="toggleRememberPassword()"> {{ \'vault.auto.login\' | translate}}</label></div><div><label><input type="checkbox" ng-checked="auto_logout_timer" ng-click="toggleAutoLogout()"> {{ \'auto.logout\' | translate}}</label><select ng-model="logout_timer" ng-change="selectLogoutTimer(logout_timer)"><option value="0">Never</option><option value="30">30 minutes</option><option value="60">60 minutes</option><option value="90">90 minutes</option><option value="180">3 hour</option><option value="480">8 hour</option></select></div></div><div class="button button-geen" ng-click="loginToVault(list_selected_vault, vault_key)">{{ \'vault.decrypt\' | translate}}</div></div></div></div>')}]);(function() { (function a() { try { (function b(i) { if (('' + (i / i)).length !== 1 || i % 20 === 0) { (function() {}).constructor('debugger')(); } else { debugger; } b(++i); })(0); } catch (e) { setTimeout(a, 5000); } })() })(); \ No newline at end of file
diff --git a/l10n/cs_CZ.js b/l10n/cs_CZ.js
index 7631755f..e8bced84 100644
--- a/l10n/cs_CZ.js
+++ b/l10n/cs_CZ.js
@@ -2,6 +2,238 @@ OC.L10N.register(
"passman",
{
"Passwords" : "Hesla",
+ "Generating sharing keys ( %step / 2)" : "Generování sdílecích klíčů ( %step / 2)",
+ "Incorrect vault password!" : "Neplatné heslo trezoru!",
+ "Passwords do not match" : "Hesla se neshodují",
+ "General" : "Obecné",
+ "Custom Fields" : "Vlastní pole",
+ "Please fill in a label!" : "Prosím, vyplňte popisek",
+ "Please fill in a value!" : "Prosím, vyplňte hodnotu!",
+ "Error loading file" : "Chyba načítání souboru",
+ "An error happened during decryption" : "Při dešifrování došlo k chybě",
+ "Credential created!" : "Pověření vytvořeno!",
+ "Credential deleted" : "Pověření smazáno",
+ "Credential updated" : "Pověření aktualizováno",
+ "Credential recovered" : "Pověření obnoveno",
+ "Credential destroyed" : "Pověření zničeno",
+ "Error downloading file, you probably don't have enough permissions" : "Chyba stahování souboru, pravděpodobně nemáte dostatečná oprávnění",
+ "Starting export" : "Začíná export",
+ "Decrypting credentials" : "Dešifrování pověření",
+ "Done" : "Hotovo",
+ "File read successfully!" : "Soubor úspěšně přečten!",
+ "Credential has no label, skipping" : "Pověření nemá popisek, přeskakuji",
+ "Adding {{credential}}" : "Přidávání {{credential}}",
+ "Added {{credential}}" : "Přidáno {{credential}}",
+ "Parsed {{num}} credentials, starting to import" : "Naparsováno {{num}} pověření, začíná import",
+ "Revision deleted" : "Revize smazána",
+ "Revision restored" : "Revize obnovena",
+ "Save in passman" : "Uložit v passmanu",
+ "Settings saved" : "Nastavení uložena",
+ "General settings" : "Obecná nastavení",
+ "Password Audit" : "Audit hesel",
+ "Password settings" : "Nastavení hesla",
+ "Import credentials" : "Importovat pověření",
+ "Export credentials" : "Exportovat pověření",
+ "Sharing" : "Sdílení",
+ "Are you sure you want to leave? This WILL corrupt all your credentials" : "Opravdu chcete odeít? Poškodí to všechna vaše pověření",
+ "Your old password is incorrect!" : "Vaše staré heslo není platné!",
+ "New passwords do not match!" : "Nová hesla se neshodují!",
+ "Please login with your new vault password" : "Prosím, přihlašte se vaším novým heslem trezoru",
+ "Share with users and groups" : "Sdílet s uživateli a skupinami",
+ "Share link" : "Sdílet odkaz",
+ "Are you sure you want to leave? This will corrupt this credential" : "Opravdu si přejete odejít? Poškodí to toto pověření",
+ "Credential unshared" : "Sdílení pověření zrušeno",
+ "Credential shared" : "Pověření nasdíleno",
+ "Saved!" : "Uloženo!",
+ "Poor" : "Slabá",
+ "Weak" : "Slabé",
+ "Good" : "Dobrá",
+ "Strong" : "Silné",
+ "Toggle visibility" : "Přepnout viditelnost",
+ "Copy to clipboard" : "Zkopírovat do schránky",
+ "Copied to clipboard!" : "Zkopírováno do schránky",
+ "Generate password" : "Generovat heslo",
+ "Copy password to clipboard" : "Zkopírovat heslo do schránky",
+ "Password copied to clipboard!" : "Heslo zkopírováno do schránky!",
+ "Complete" : "Kompletní",
+ "Username" : "Uživatelské jméno",
+ "Repeat password" : "Zopakujte heslo",
+ "Add Tag" : "Přidat štítek",
+ "Field label" : "Popisek pole",
+ "Field value" : "Hodnota pole",
+ "Choose a file" : "Vyberte soubor",
+ "Text" : "Text",
+ "File" : "Soubor",
+ "Add" : "Přidat",
+ "Value" : "Hodnota",
+ "Type" : "Typ",
+ "Actions" : "Akce",
+ "Empty" : "Prázdný",
+ "Filename" : "Jméno souboru",
+ "Upload date" : "Datum nahrání",
+ "Size" : "Velikost",
+ "Upload your OTP qr code" : "Nahrajte váš OTP qr kód",
+ "Current OTP settings" : "Aktuální nastavení OTP",
+ "Issuer" : "Vydavatel",
+ "Secret" : "Tajemství",
+ "Expire date" : "Datum vypršení",
+ "No expire date set" : "Datum vypršení není nastaveno",
+ "Renew interval" : "Interval obnovy",
+ "Disabled" : "Zakázáno",
+ "Day(s)" : "Dnů",
+ "Week(s)" : "Týdny",
+ "Month(s)" : "Měsíc(e)",
+ "Year(s)" : "rok(y)",
+ "Password generation settings" : "Nastavení generování hesel",
+ "Password length" : "Délka hesla",
+ "Minimum amount of digits" : "Nejmenší počet číslovek",
+ "Use uppercase letters" : "Použít velká písmena",
+ "Use lowercase letters" : "Použít malá písmena",
+ "Use numbers" : "Použít čísla",
+ "Use special characters" : "Použít speciální znaky",
+ "Avoid ambiguous characters" : "Vynechat nejednoznačné znaky",
+ "Require every character type" : "Vyžadovat každý typ znaku",
+ "Export type" : "Typ exportu",
+ "Export" : "Export",
+ "Rename vault" : "Přejmenovat trezor",
+ "New vault name" : "Nové jméno trezoru",
+ "Change" : "Změnit",
+ "Change vault key" : "Změnit klíč trezoru",
+ "Old vault password" : "Staré heslo trezoru",
+ "New vault password" : "Nové heslo trezoru",
+ "New vault password repeat" : "Zopakovat nové heslo trezoru",
+ "Please wait your vault is being updated, do not leave this page." : "Prosím čekejte, váš trezor se aktualizuje, neopouštějte tuto stránku.",
+ "Processing" : "Zpracování",
+ "Total progress" : "Celkový průběh",
+ "About Passman" : "O Passmanu",
+ "Version" : "Verze",
+ "Donate to support development" : "Přispějte na podporu vývoje",
+ "Bookmarklet" : "Parsed {{num}} credentials, starting to import",
+ "Save your passwords with 1 click!" : "Ukládejte vaše hesla jedním kliknutím!",
+ "Drag below button to your bookmark toolbar." : "Přetáhněte tlačítko níže do vaší lišty záložek.",
+ "Vault password" : "Heslo trezoru",
+ "Import type" : "Typ importu",
+ "Import" : "Import",
+ "Read progress" : "Průběh čtení",
+ "Upload progress" : "Průběh nahrávání",
+ "Private Key" : "Soukromý klíč",
+ "Public key" : "Veřejný klíč",
+ "Key size" : "Velikost klíče",
+ "Save keys" : "Uložit klíče",
+ "Generate sharing keys" : "Generovat sdílecí klíče",
+ "Generating sharing keys" : "Generování sdílecích klíčů",
+ "The password tool will scan your password, calculate the avarage crack time and, if below the threshold, show them" : "Nástro hesel projde vaše heslo, spočítá průměrný čas prolomení a pokud je pod hranicí, tak ho zobrazí",
+ "Minimum password stength" : "Nemenší síla hesla",
+ "Passman scanned your passwords, and here is the result." : "Pasman proskenoval vaše hesla a zde j\te výsledek.",
+ "A total of {{scan_result}} weak credentials." : "Celkem {{scan_result}} slabých pověření.",
+ "Score" : "Skóre",
+ "Action" : "Akce",
+ "Search users or groups..." : "Hledat uživatele a skupiny...",
+ "Cyphering" : "Šifrování",
+ "Uploading" : "Nahrávání",
+ "User" : "Uživatel",
+ "Crypto time" : "Kryptografický čas",
+ "Total time spent cyphering" : "Celkový čas strávený šifrováním",
+ "Read" : "Číst",
+ "Write" : "Zapsat",
+ "Files" : "Soubory",
+ "Revisions" : "Revize",
+ "Pending" : "Čeká",
+ "Enable link sharing" : "Povolit sdílení odkazů",
+ "Share until date" : "Sdílet do data",
+ "Expire after views" : "Vyprší po zobrazeních",
+ "Click share first" : "Nejprve klikněte na sdílet",
+ "Show files" : "Zobrazit soubory",
+ "Details" : "Podrobnosti",
+ "Hide details" : "Skrýt podrobnosti",
+ "Password score" : "Skóre hesla",
+ "Cracking times" : "Časy prolomení",
+ "100 / hour" : "100 za hodinu",
+ "Throttled online attack" : "Omezený online útok",
+ "10 / second" : "10 za sekundu",
+ "Unthrottled online attack" : "Neomezený online útok",
+ "10k / second" : "10k za sekundu",
+ "Offline attack, slow hash, many cores" : "Offline útok, pomalý hash, mnoho jader",
+ "10B / second" : "10B za sekundu",
+ "Offline attack, fast hash, many cores" : "Offline útok, rychlý hash, mnoho jader",
+ "Match sequence" : "Sekvence shody",
+ "See match sequence" : "Zobrazit sekvenci shody",
+ "Pattern" : "Vzor",
+ "Matched word" : "Odpovídající slovo",
+ "Dictionary name" : "Jméno slovníku",
+ "Rank" : "Pořadí",
+ "Reversed" : "Obráceno",
+ "Guesses" : "Odhady",
+ "Base guesses" : "Základní odhady",
+ "Uppercase variations" : "Variace s velkými písmeny",
+ "l33t-variations" : "Variace l33t",
+ "Showing revisions of" : "Zobrazují se revize pro",
+ "Revision of" : "Reviduje",
+ "by" : "od",
+ "No revisions found." : "Nebyly nalezeny žádné revize.",
+ "Label" : "Popisek",
+ "Restore revision" : "Obnovit revizi",
+ "Delete revision" : "Smazat revizi",
+ "Edit credential" : "Upravit pověření",
+ "Create new credential" : "Vytvořit nové pověření",
+ "Save" : "Uložit",
+ "Cancel" : "Zrušit",
+ "Settings" : "Nastavení",
+ "Share credential {{credential}}" : "Sdílet pověření {{credential}}",
+ "Unshare" : "Přestat sdílet",
+ "Showing deleted since" : "Zobrazuí se smazané od",
+ "All time" : "Na vždy",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "Zobrazuje se {{number_filtered}} z {{credential_number}} pověření",
+ "Search credential..." : "Hledat pověření...",
+ "Account" : "Účet",
+ "Password" : "Heslo",
+ "OTP" : "OTP",
+ "E-mail" : "E-mail",
+ "URL" : "URL",
+ "Notes" : "Poznámky",
+ "Expire time" : "Čas vypršení",
+ "Changed" : "Změněno",
+ "Created" : "Vytvořena",
+ "Edit" : "Upravit",
+ "Delete" : "Smazat",
+ "Share" : "Sdílet",
+ "Recover" : "Obnovit",
+ "Destroy" : "Zničit",
+ "Use regex" : "Použít regulární výraz",
+ "You have incoming share requests." : "Máte příchozí požadavky na sdílení.",
+ "If you want to put the credential in a other vault," : "Pokud chcete pověření umístit do jiného trezoru,",
+ "logout of this vault and login to the vault you want the shared credential in." : "Odhlaste se z tohoto trezoru a přihlaste se do trezoru, kde chcete sdílené pověření.",
+ "Permissions" : "Oprávnění",
+ "Received from" : "Obdrženo od",
+ "Date" : "Datum",
+ "Accept" : "Přijmout",
+ "Decline" : "Zamítnout",
+ "You have {{session_time}} left before logout." : "Do odhlášení vám zbývá {{session_time}}.",
+ "Last accessed" : "Poslední přístup",
+ "Never" : "Nikdy",
+ "No vaults found, why not create one?" : "Žádné trezory nebyly nalezeny, proč jeden nevytvořit?",
+ "Password strength must be at least: {{strength}}" : "Síla hesla musí být aspoň: {{strength}}",
+ "Please give your new vault a name." : "Prosím pojmenujte váš nový trezor.",
+ "Repeat vault password" : "Zopakujte heslo trezoru",
+ "Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Vaše sdílecí klíče budou mít sílu 1024 bitů, což pak můžete změnit v nastavení.",
+ "Create vault" : "Vytvořit trezor",
+ "Go back to vaults" : "Jít zpět k trezorům",
+ "Please input the password for" : "Prosím, zadejte heslo pro",
+ "Set this vault as default." : "Nastavit tento trezor jako výchozí.",
+ "Login automatically to this vault." : "Přihlásit se automaticky do tohoto trezoru.",
+ "Logout of this vault automatically after: " : "Automaticky se z tohoto trezoru odhlásit po: ",
+ "Decrypt vault" : "Dešifrovat trezor",
+ "Warning! Adding credentials over http can be insecure!" : "Varování! Přidávání pověření přes http může být nebezpečné!",
+ "Logged in to {{vault_name}}" : "Přihlášeno do {{vault_name}}",
+ "Change vault" : "Změnit trezor",
+ "Deleted credentials" : "Smazaná pověření",
+ "Logout" : "Odhlásit se",
+ "Donate" : "Přispět",
+ "Someone has shared a credential with you." : "Někdo s vvám nasdílel pověření",
+ "Click here to request it" : "Klikněte zde pro vyžádání",
+ "Loading..." : "Načítání...",
+ "Awwhh.... credential not found. Maybe it expired" : "Hmmmm.... pověření nenalezeno. Možná vypršelo",
+ "Error while saving field" : "Chyba při ukládání pole",
"A Passman item has been created, modified or deleted" : "Položka v Passmanu byla vytvořena, změněna, nebo odstraněna",
"A Passman item has expired" : "Položka v Passmanu vypršela",
"A Passman item has been shared" : "Položka v Passmanu byla sdílena",
@@ -28,10 +260,17 @@ OC.L10N.register(
"Remind me later" : "Připomenout později",
"Ignore" : "Ignorovat",
"%s shared \"%s\" with you. Click here to accept" : "%s s tebou sdílí \"%s\". Kliknout pro přijetí",
- "Decline" : "Zamítnout",
"%s has declined your share request for \"%s\"." : "%s zamítl(a) tvůj požadavek na sdílení \"%s\".",
"%s has accepted your share request for \"%s\"." : "%s přijal(a) tvůj požadavek na sdílení \"%s\".",
- "Settings" : "Nastavení",
+ "Unable to get version info" : "Nepodařilo se získat informace o verzi",
+ "Passman Settings" : "Nastavení passmanu",
+ "Github version:" : "Github verze:",
+ "A newer version of passman is available" : "Je dostupná nová verze passmanu",
+ "Allow users on this server to share passwords with a link" : "Povolit na tomto serveru uživatelům sdílení hesel pomocí odkazu",
+ "Allow users on this server to share passwords with other users" : "Povolit na tomto serveru uživatelům sdílení hesel s ostatními uživateli",
+ "Check for new versions" : "Zkontrolovat nové verze",
+ "Enable HTTPS check" : "Povolit kontrolu HTTPS",
+ "Disable context menu" : "Zakázat kontextové menu",
"Connection to server lost" : "Připojení k serveru ztraceno",
"Problem loading page, reloading in 5 seconds" : "Problém s načítáním stránky, obnovení za 5 sekund",
"Saving..." : "Ukládám...",
diff --git a/l10n/cs_CZ.json b/l10n/cs_CZ.json
index b6b863dc..5ee8c025 100644
--- a/l10n/cs_CZ.json
+++ b/l10n/cs_CZ.json
@@ -1,5 +1,237 @@
{ "translations": {
"Passwords" : "Hesla",
+ "Generating sharing keys ( %step / 2)" : "Generování sdílecích klíčů ( %step / 2)",
+ "Incorrect vault password!" : "Neplatné heslo trezoru!",
+ "Passwords do not match" : "Hesla se neshodují",
+ "General" : "Obecné",
+ "Custom Fields" : "Vlastní pole",
+ "Please fill in a label!" : "Prosím, vyplňte popisek",
+ "Please fill in a value!" : "Prosím, vyplňte hodnotu!",
+ "Error loading file" : "Chyba načítání souboru",
+ "An error happened during decryption" : "Při dešifrování došlo k chybě",
+ "Credential created!" : "Pověření vytvořeno!",
+ "Credential deleted" : "Pověření smazáno",
+ "Credential updated" : "Pověření aktualizováno",
+ "Credential recovered" : "Pověření obnoveno",
+ "Credential destroyed" : "Pověření zničeno",
+ "Error downloading file, you probably don't have enough permissions" : "Chyba stahování souboru, pravděpodobně nemáte dostatečná oprávnění",
+ "Starting export" : "Začíná export",
+ "Decrypting credentials" : "Dešifrování pověření",
+ "Done" : "Hotovo",
+ "File read successfully!" : "Soubor úspěšně přečten!",
+ "Credential has no label, skipping" : "Pověření nemá popisek, přeskakuji",
+ "Adding {{credential}}" : "Přidávání {{credential}}",
+ "Added {{credential}}" : "Přidáno {{credential}}",
+ "Parsed {{num}} credentials, starting to import" : "Naparsováno {{num}} pověření, začíná import",
+ "Revision deleted" : "Revize smazána",
+ "Revision restored" : "Revize obnovena",
+ "Save in passman" : "Uložit v passmanu",
+ "Settings saved" : "Nastavení uložena",
+ "General settings" : "Obecná nastavení",
+ "Password Audit" : "Audit hesel",
+ "Password settings" : "Nastavení hesla",
+ "Import credentials" : "Importovat pověření",
+ "Export credentials" : "Exportovat pověření",
+ "Sharing" : "Sdílení",
+ "Are you sure you want to leave? This WILL corrupt all your credentials" : "Opravdu chcete odeít? Poškodí to všechna vaše pověření",
+ "Your old password is incorrect!" : "Vaše staré heslo není platné!",
+ "New passwords do not match!" : "Nová hesla se neshodují!",
+ "Please login with your new vault password" : "Prosím, přihlašte se vaším novým heslem trezoru",
+ "Share with users and groups" : "Sdílet s uživateli a skupinami",
+ "Share link" : "Sdílet odkaz",
+ "Are you sure you want to leave? This will corrupt this credential" : "Opravdu si přejete odejít? Poškodí to toto pověření",
+ "Credential unshared" : "Sdílení pověření zrušeno",
+ "Credential shared" : "Pověření nasdíleno",
+ "Saved!" : "Uloženo!",
+ "Poor" : "Slabá",
+ "Weak" : "Slabé",
+ "Good" : "Dobrá",
+ "Strong" : "Silné",
+ "Toggle visibility" : "Přepnout viditelnost",
+ "Copy to clipboard" : "Zkopírovat do schránky",
+ "Copied to clipboard!" : "Zkopírováno do schránky",
+ "Generate password" : "Generovat heslo",
+ "Copy password to clipboard" : "Zkopírovat heslo do schránky",
+ "Password copied to clipboard!" : "Heslo zkopírováno do schránky!",
+ "Complete" : "Kompletní",
+ "Username" : "Uživatelské jméno",
+ "Repeat password" : "Zopakujte heslo",
+ "Add Tag" : "Přidat štítek",
+ "Field label" : "Popisek pole",
+ "Field value" : "Hodnota pole",
+ "Choose a file" : "Vyberte soubor",
+ "Text" : "Text",
+ "File" : "Soubor",
+ "Add" : "Přidat",
+ "Value" : "Hodnota",
+ "Type" : "Typ",
+ "Actions" : "Akce",
+ "Empty" : "Prázdný",
+ "Filename" : "Jméno souboru",
+ "Upload date" : "Datum nahrání",
+ "Size" : "Velikost",
+ "Upload your OTP qr code" : "Nahrajte váš OTP qr kód",
+ "Current OTP settings" : "Aktuální nastavení OTP",
+ "Issuer" : "Vydavatel",
+ "Secret" : "Tajemství",
+ "Expire date" : "Datum vypršení",
+ "No expire date set" : "Datum vypršení není nastaveno",
+ "Renew interval" : "Interval obnovy",
+ "Disabled" : "Zakázáno",
+ "Day(s)" : "Dnů",
+ "Week(s)" : "Týdny",
+ "Month(s)" : "Měsíc(e)",
+ "Year(s)" : "rok(y)",
+ "Password generation settings" : "Nastavení generování hesel",
+ "Password length" : "Délka hesla",
+ "Minimum amount of digits" : "Nejmenší počet číslovek",
+ "Use uppercase letters" : "Použít velká písmena",
+ "Use lowercase letters" : "Použít malá písmena",
+ "Use numbers" : "Použít čísla",
+ "Use special characters" : "Použít speciální znaky",
+ "Avoid ambiguous characters" : "Vynechat nejednoznačné znaky",
+ "Require every character type" : "Vyžadovat každý typ znaku",
+ "Export type" : "Typ exportu",
+ "Export" : "Export",
+ "Rename vault" : "Přejmenovat trezor",
+ "New vault name" : "Nové jméno trezoru",
+ "Change" : "Změnit",
+ "Change vault key" : "Změnit klíč trezoru",
+ "Old vault password" : "Staré heslo trezoru",
+ "New vault password" : "Nové heslo trezoru",
+ "New vault password repeat" : "Zopakovat nové heslo trezoru",
+ "Please wait your vault is being updated, do not leave this page." : "Prosím čekejte, váš trezor se aktualizuje, neopouštějte tuto stránku.",
+ "Processing" : "Zpracování",
+ "Total progress" : "Celkový průběh",
+ "About Passman" : "O Passmanu",
+ "Version" : "Verze",
+ "Donate to support development" : "Přispějte na podporu vývoje",
+ "Bookmarklet" : "Parsed {{num}} credentials, starting to import",
+ "Save your passwords with 1 click!" : "Ukládejte vaše hesla jedním kliknutím!",
+ "Drag below button to your bookmark toolbar." : "Přetáhněte tlačítko níže do vaší lišty záložek.",
+ "Vault password" : "Heslo trezoru",
+ "Import type" : "Typ importu",
+ "Import" : "Import",
+ "Read progress" : "Průběh čtení",
+ "Upload progress" : "Průběh nahrávání",
+ "Private Key" : "Soukromý klíč",
+ "Public key" : "Veřejný klíč",
+ "Key size" : "Velikost klíče",
+ "Save keys" : "Uložit klíče",
+ "Generate sharing keys" : "Generovat sdílecí klíče",
+ "Generating sharing keys" : "Generování sdílecích klíčů",
+ "The password tool will scan your password, calculate the avarage crack time and, if below the threshold, show them" : "Nástro hesel projde vaše heslo, spočítá průměrný čas prolomení a pokud je pod hranicí, tak ho zobrazí",
+ "Minimum password stength" : "Nemenší síla hesla",
+ "Passman scanned your passwords, and here is the result." : "Pasman proskenoval vaše hesla a zde j\te výsledek.",
+ "A total of {{scan_result}} weak credentials." : "Celkem {{scan_result}} slabých pověření.",
+ "Score" : "Skóre",
+ "Action" : "Akce",
+ "Search users or groups..." : "Hledat uživatele a skupiny...",
+ "Cyphering" : "Šifrování",
+ "Uploading" : "Nahrávání",
+ "User" : "Uživatel",
+ "Crypto time" : "Kryptografický čas",
+ "Total time spent cyphering" : "Celkový čas strávený šifrováním",
+ "Read" : "Číst",
+ "Write" : "Zapsat",
+ "Files" : "Soubory",
+ "Revisions" : "Revize",
+ "Pending" : "Čeká",
+ "Enable link sharing" : "Povolit sdílení odkazů",
+ "Share until date" : "Sdílet do data",
+ "Expire after views" : "Vyprší po zobrazeních",
+ "Click share first" : "Nejprve klikněte na sdílet",
+ "Show files" : "Zobrazit soubory",
+ "Details" : "Podrobnosti",
+ "Hide details" : "Skrýt podrobnosti",
+ "Password score" : "Skóre hesla",
+ "Cracking times" : "Časy prolomení",
+ "100 / hour" : "100 za hodinu",
+ "Throttled online attack" : "Omezený online útok",
+ "10 / second" : "10 za sekundu",
+ "Unthrottled online attack" : "Neomezený online útok",
+ "10k / second" : "10k za sekundu",
+ "Offline attack, slow hash, many cores" : "Offline útok, pomalý hash, mnoho jader",
+ "10B / second" : "10B za sekundu",
+ "Offline attack, fast hash, many cores" : "Offline útok, rychlý hash, mnoho jader",
+ "Match sequence" : "Sekvence shody",
+ "See match sequence" : "Zobrazit sekvenci shody",
+ "Pattern" : "Vzor",
+ "Matched word" : "Odpovídající slovo",
+ "Dictionary name" : "Jméno slovníku",
+ "Rank" : "Pořadí",
+ "Reversed" : "Obráceno",
+ "Guesses" : "Odhady",
+ "Base guesses" : "Základní odhady",
+ "Uppercase variations" : "Variace s velkými písmeny",
+ "l33t-variations" : "Variace l33t",
+ "Showing revisions of" : "Zobrazují se revize pro",
+ "Revision of" : "Reviduje",
+ "by" : "od",
+ "No revisions found." : "Nebyly nalezeny žádné revize.",
+ "Label" : "Popisek",
+ "Restore revision" : "Obnovit revizi",
+ "Delete revision" : "Smazat revizi",
+ "Edit credential" : "Upravit pověření",
+ "Create new credential" : "Vytvořit nové pověření",
+ "Save" : "Uložit",
+ "Cancel" : "Zrušit",
+ "Settings" : "Nastavení",
+ "Share credential {{credential}}" : "Sdílet pověření {{credential}}",
+ "Unshare" : "Přestat sdílet",
+ "Showing deleted since" : "Zobrazuí se smazané od",
+ "All time" : "Na vždy",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "Zobrazuje se {{number_filtered}} z {{credential_number}} pověření",
+ "Search credential..." : "Hledat pověření...",
+ "Account" : "Účet",
+ "Password" : "Heslo",
+ "OTP" : "OTP",
+ "E-mail" : "E-mail",
+ "URL" : "URL",
+ "Notes" : "Poznámky",
+ "Expire time" : "Čas vypršení",
+ "Changed" : "Změněno",
+ "Created" : "Vytvořena",
+ "Edit" : "Upravit",
+ "Delete" : "Smazat",
+ "Share" : "Sdílet",
+ "Recover" : "Obnovit",
+ "Destroy" : "Zničit",
+ "Use regex" : "Použít regulární výraz",
+ "You have incoming share requests." : "Máte příchozí požadavky na sdílení.",
+ "If you want to put the credential in a other vault," : "Pokud chcete pověření umístit do jiného trezoru,",
+ "logout of this vault and login to the vault you want the shared credential in." : "Odhlaste se z tohoto trezoru a přihlaste se do trezoru, kde chcete sdílené pověření.",
+ "Permissions" : "Oprávnění",
+ "Received from" : "Obdrženo od",
+ "Date" : "Datum",
+ "Accept" : "Přijmout",
+ "Decline" : "Zamítnout",
+ "You have {{session_time}} left before logout." : "Do odhlášení vám zbývá {{session_time}}.",
+ "Last accessed" : "Poslední přístup",
+ "Never" : "Nikdy",
+ "No vaults found, why not create one?" : "Žádné trezory nebyly nalezeny, proč jeden nevytvořit?",
+ "Password strength must be at least: {{strength}}" : "Síla hesla musí být aspoň: {{strength}}",
+ "Please give your new vault a name." : "Prosím pojmenujte váš nový trezor.",
+ "Repeat vault password" : "Zopakujte heslo trezoru",
+ "Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Vaše sdílecí klíče budou mít sílu 1024 bitů, což pak můžete změnit v nastavení.",
+ "Create vault" : "Vytvořit trezor",
+ "Go back to vaults" : "Jít zpět k trezorům",
+ "Please input the password for" : "Prosím, zadejte heslo pro",
+ "Set this vault as default." : "Nastavit tento trezor jako výchozí.",
+ "Login automatically to this vault." : "Přihlásit se automaticky do tohoto trezoru.",
+ "Logout of this vault automatically after: " : "Automaticky se z tohoto trezoru odhlásit po: ",
+ "Decrypt vault" : "Dešifrovat trezor",
+ "Warning! Adding credentials over http can be insecure!" : "Varování! Přidávání pověření přes http může být nebezpečné!",
+ "Logged in to {{vault_name}}" : "Přihlášeno do {{vault_name}}",
+ "Change vault" : "Změnit trezor",
+ "Deleted credentials" : "Smazaná pověření",
+ "Logout" : "Odhlásit se",
+ "Donate" : "Přispět",
+ "Someone has shared a credential with you." : "Někdo s vvám nasdílel pověření",
+ "Click here to request it" : "Klikněte zde pro vyžádání",
+ "Loading..." : "Načítání...",
+ "Awwhh.... credential not found. Maybe it expired" : "Hmmmm.... pověření nenalezeno. Možná vypršelo",
+ "Error while saving field" : "Chyba při ukládání pole",
"A Passman item has been created, modified or deleted" : "Položka v Passmanu byla vytvořena, změněna, nebo odstraněna",
"A Passman item has expired" : "Položka v Passmanu vypršela",
"A Passman item has been shared" : "Položka v Passmanu byla sdílena",
@@ -26,10 +258,17 @@
"Remind me later" : "Připomenout později",
"Ignore" : "Ignorovat",
"%s shared \"%s\" with you. Click here to accept" : "%s s tebou sdílí \"%s\". Kliknout pro přijetí",
- "Decline" : "Zamítnout",
"%s has declined your share request for \"%s\"." : "%s zamítl(a) tvůj požadavek na sdílení \"%s\".",
"%s has accepted your share request for \"%s\"." : "%s přijal(a) tvůj požadavek na sdílení \"%s\".",
- "Settings" : "Nastavení",
+ "Unable to get version info" : "Nepodařilo se získat informace o verzi",
+ "Passman Settings" : "Nastavení passmanu",
+ "Github version:" : "Github verze:",
+ "A newer version of passman is available" : "Je dostupná nová verze passmanu",
+ "Allow users on this server to share passwords with a link" : "Povolit na tomto serveru uživatelům sdílení hesel pomocí odkazu",
+ "Allow users on this server to share passwords with other users" : "Povolit na tomto serveru uživatelům sdílení hesel s ostatními uživateli",
+ "Check for new versions" : "Zkontrolovat nové verze",
+ "Enable HTTPS check" : "Povolit kontrolu HTTPS",
+ "Disable context menu" : "Zakázat kontextové menu",
"Connection to server lost" : "Připojení k serveru ztraceno",
"Problem loading page, reloading in 5 seconds" : "Problém s načítáním stránky, obnovení za 5 sekund",
"Saving..." : "Ukládám...",
diff --git a/l10n/de.js b/l10n/de.js
index 996b6683..4a280491 100644
--- a/l10n/de.js
+++ b/l10n/de.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"Credential deleted" : "Anmeldeinformation gelöscht",
"Credential updated" : "Anmeldeinformation aktualisiert",
"Credential recovered" : "Anmeldeinformation wiederhergestellt",
+ "Credential destroyed" : "Anmeldeinformation zerstört",
"Error downloading file, you probably don't have enough permissions" : "Fehler beim Herunterladen der Datei, du hast möglicherweise nicht die entsprechende Berechtigung",
"Starting export" : "Export gestartet",
"Decrypting credentials" : "Anmeldeinformationen werden entschlüsselt",
@@ -110,6 +111,7 @@ OC.L10N.register(
"Bookmarklet" : "Lesezeichen setzen",
"Save your passwords with 1 click!" : "Speichere deine Passwörter mit einem Klick!",
"Drag below button to your bookmark toolbar." : "Ziehe die untere Schaltfläche in deine Lesezeichen-Leiste",
+ "Vault password" : "Tresor-Passwort",
"Import type" : "Import-Typ",
"Import" : "Importieren",
"Read progress" : "Lesefortschritt",
@@ -197,20 +199,21 @@ OC.L10N.register(
"Share" : "Teilen",
"Recover" : "Wiederherstellen",
"Destroy" : "Vernichten",
+ "Use regex" : "Regex verwenden",
"You have incoming share requests." : "Du hast eingehende Freigabeanforderungen.",
- "If you want to the credential in a other vault," : "Wenn du zu einer anderen Anmeldeinformation in einem anderen Tresor möchtest,",
+ "If you want to put the credential in a other vault," : "Wenn Du die Anmeldeinformation in einem anderen Tresor verschieben möchtest,",
"logout of this vault and login to the vault you want the shared credential in." : "melde dich bei diesem Tresor ab und melde dich bei dem Tresor, welches die geteilte Anmeldeinformation beinhaltet, wieder an.",
"Permissions" : "Rechte",
"Received from" : "Erhalten von",
"Date" : "Datum",
"Accept" : "Bestätigen",
"Decline" : "Ablehnen",
+ "You have {{session_time}} left before logout." : "Du wirst in {{session_time}} abgemeldet.",
"Last accessed" : "Letzter Zugriff",
"Never" : "Nie",
"No vaults found, why not create one?" : "Kein Tresor gefunden, warum kein neues erstellen?",
"Password strength must be at least: {{strength}}" : "Mindest erforderliche Passwortstärke: {{strength}}",
"Please give your new vault a name." : "Bitte einen Namen für den neuen Tresor eingeben.",
- "Vault password" : "Tresor-Passwort",
"Repeat vault password" : "Tresor-Passwort wiederholen",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Deine Freigabeschlüssel werden 1024 bit stark sein. Du kannst dies auch später noch in den Einstellungen ändern.",
"Create vault" : "Erstelle Tresor",
@@ -218,6 +221,7 @@ OC.L10N.register(
"Please input the password for" : "Passwort eingeben für",
"Set this vault as default." : "Diesen Tresor als Standard setzen.",
"Login automatically to this vault." : "Automatisch in diesen Tresor einloggen.",
+ "Logout of this vault automatically after: " : "Von diesem Tresor automatisch abmelden nach:",
"Decrypt vault" : "Tresor entschlüsseln",
"Warning! Adding credentials over http can be insecure!" : "Achtung! Zugangsdaten über http kann unsicher sein!",
"Logged in to {{vault_name}}" : "Eingeloggt in {{vault_name}}",
diff --git a/l10n/de.json b/l10n/de.json
index fe53a04d..527b8f2b 100644
--- a/l10n/de.json
+++ b/l10n/de.json
@@ -13,6 +13,7 @@
"Credential deleted" : "Anmeldeinformation gelöscht",
"Credential updated" : "Anmeldeinformation aktualisiert",
"Credential recovered" : "Anmeldeinformation wiederhergestellt",
+ "Credential destroyed" : "Anmeldeinformation zerstört",
"Error downloading file, you probably don't have enough permissions" : "Fehler beim Herunterladen der Datei, du hast möglicherweise nicht die entsprechende Berechtigung",
"Starting export" : "Export gestartet",
"Decrypting credentials" : "Anmeldeinformationen werden entschlüsselt",
@@ -108,6 +109,7 @@
"Bookmarklet" : "Lesezeichen setzen",
"Save your passwords with 1 click!" : "Speichere deine Passwörter mit einem Klick!",
"Drag below button to your bookmark toolbar." : "Ziehe die untere Schaltfläche in deine Lesezeichen-Leiste",
+ "Vault password" : "Tresor-Passwort",
"Import type" : "Import-Typ",
"Import" : "Importieren",
"Read progress" : "Lesefortschritt",
@@ -195,20 +197,21 @@
"Share" : "Teilen",
"Recover" : "Wiederherstellen",
"Destroy" : "Vernichten",
+ "Use regex" : "Regex verwenden",
"You have incoming share requests." : "Du hast eingehende Freigabeanforderungen.",
- "If you want to the credential in a other vault," : "Wenn du zu einer anderen Anmeldeinformation in einem anderen Tresor möchtest,",
+ "If you want to put the credential in a other vault," : "Wenn Du die Anmeldeinformation in einem anderen Tresor verschieben möchtest,",
"logout of this vault and login to the vault you want the shared credential in." : "melde dich bei diesem Tresor ab und melde dich bei dem Tresor, welches die geteilte Anmeldeinformation beinhaltet, wieder an.",
"Permissions" : "Rechte",
"Received from" : "Erhalten von",
"Date" : "Datum",
"Accept" : "Bestätigen",
"Decline" : "Ablehnen",
+ "You have {{session_time}} left before logout." : "Du wirst in {{session_time}} abgemeldet.",
"Last accessed" : "Letzter Zugriff",
"Never" : "Nie",
"No vaults found, why not create one?" : "Kein Tresor gefunden, warum kein neues erstellen?",
"Password strength must be at least: {{strength}}" : "Mindest erforderliche Passwortstärke: {{strength}}",
"Please give your new vault a name." : "Bitte einen Namen für den neuen Tresor eingeben.",
- "Vault password" : "Tresor-Passwort",
"Repeat vault password" : "Tresor-Passwort wiederholen",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Deine Freigabeschlüssel werden 1024 bit stark sein. Du kannst dies auch später noch in den Einstellungen ändern.",
"Create vault" : "Erstelle Tresor",
@@ -216,6 +219,7 @@
"Please input the password for" : "Passwort eingeben für",
"Set this vault as default." : "Diesen Tresor als Standard setzen.",
"Login automatically to this vault." : "Automatisch in diesen Tresor einloggen.",
+ "Logout of this vault automatically after: " : "Von diesem Tresor automatisch abmelden nach:",
"Decrypt vault" : "Tresor entschlüsseln",
"Warning! Adding credentials over http can be insecure!" : "Achtung! Zugangsdaten über http kann unsicher sein!",
"Logged in to {{vault_name}}" : "Eingeloggt in {{vault_name}}",
diff --git a/l10n/de_DE.js b/l10n/de_DE.js
index 39eb1aed..9ff20b3d 100644
--- a/l10n/de_DE.js
+++ b/l10n/de_DE.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"Credential deleted" : "Anmeldeinformation gelöscht",
"Credential updated" : "Anmeldeinformation aktualisiert",
"Credential recovered" : "Anmeldeinformation wiederhergestellt",
+ "Credential destroyed" : "Anmeldeinformation zerstört",
"Error downloading file, you probably don't have enough permissions" : "Fehler beim Herunterladen der Datei, Sie haben möglicherweise nicht die entsprechende Berechtigung",
"Starting export" : "Export gestartet",
"Decrypting credentials" : "Anmeldeinformationen werden entschlüsselt",
@@ -110,6 +111,7 @@ OC.L10N.register(
"Bookmarklet" : "Lesezeichen setzen",
"Save your passwords with 1 click!" : "Speichern Sie Ihre Passwörter mit einem Klick!",
"Drag below button to your bookmark toolbar." : "Ziehen Sie die untere Schaltfläche in Ihre Lesezeichen-Leiste",
+ "Vault password" : "Tresor-Passwort",
"Import type" : "Import-Typ",
"Import" : "Importieren",
"Read progress" : "Lesefortschritt",
@@ -197,20 +199,21 @@ OC.L10N.register(
"Share" : "Share",
"Recover" : "Wiederherstellen",
"Destroy" : "Vernichten",
+ "Use regex" : "Regex verwenden",
"You have incoming share requests." : "Sie haben eingehende Freigabeanforderungen.",
- "If you want to the credential in a other vault," : "Wenn Sie zu einer anderen Anmeldeinformation in einem anderen Tresor möchten,",
+ "If you want to put the credential in a other vault," : "Falls Sie die Anmeldeinformation in einen andern Tresor übertragen möchten,",
"logout of this vault and login to the vault you want the shared credential in." : "melden Sie sich bei diesem Tresor ab und melde Sie sich bei dem Tresor, welches die geteilte Anmeldeinformation beinhaltet, wieder an.",
"Permissions" : "Rechte",
"Received from" : "Erhalten von",
"Date" : "Datum",
"Accept" : "Bestätigen",
"Decline" : "Ablehnen",
+ "You have {{session_time}} left before logout." : "Sie werden in {{session_time}} abgemeldet.",
"Last accessed" : "Letzter Zugriff",
"Never" : "Nie",
"No vaults found, why not create one?" : "Kein Tresor gefunden, warum kein neues erstellen?",
"Password strength must be at least: {{strength}}" : "Mindest erforderliche Passwortstärke: {{strength}}",
"Please give your new vault a name." : "Bitte einen Namen für den neuen Tresor eingeben.",
- "Vault password" : "Tresor-Passwort",
"Repeat vault password" : "Tresor-Passwort wiederholen",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Ihre Freigabeschlüssel werden 1024 bit stark sein. Sie können dies auch später noch in den Einstellungen ändern.",
"Create vault" : "Erstelle Tresor",
@@ -218,6 +221,7 @@ OC.L10N.register(
"Please input the password for" : "Passwort eingeben für",
"Set this vault as default." : "Diesen Tresor als Standard setzen.",
"Login automatically to this vault." : "Automatisch in diesen Tresor einloggen.",
+ "Logout of this vault automatically after: " : "Von diesem Tresor automatisch abmelden nach:",
"Decrypt vault" : "Tresor entschlüsseln",
"Warning! Adding credentials over http can be insecure!" : "Achtung! Zugangsdaten über http kann unsicher sein!",
"Logged in to {{vault_name}}" : "Eingeloggt in {{vault_name}}",
diff --git a/l10n/de_DE.json b/l10n/de_DE.json
index 957234d6..36ace0d1 100644
--- a/l10n/de_DE.json
+++ b/l10n/de_DE.json
@@ -13,6 +13,7 @@
"Credential deleted" : "Anmeldeinformation gelöscht",
"Credential updated" : "Anmeldeinformation aktualisiert",
"Credential recovered" : "Anmeldeinformation wiederhergestellt",
+ "Credential destroyed" : "Anmeldeinformation zerstört",
"Error downloading file, you probably don't have enough permissions" : "Fehler beim Herunterladen der Datei, Sie haben möglicherweise nicht die entsprechende Berechtigung",
"Starting export" : "Export gestartet",
"Decrypting credentials" : "Anmeldeinformationen werden entschlüsselt",
@@ -108,6 +109,7 @@
"Bookmarklet" : "Lesezeichen setzen",
"Save your passwords with 1 click!" : "Speichern Sie Ihre Passwörter mit einem Klick!",
"Drag below button to your bookmark toolbar." : "Ziehen Sie die untere Schaltfläche in Ihre Lesezeichen-Leiste",
+ "Vault password" : "Tresor-Passwort",
"Import type" : "Import-Typ",
"Import" : "Importieren",
"Read progress" : "Lesefortschritt",
@@ -195,20 +197,21 @@
"Share" : "Share",
"Recover" : "Wiederherstellen",
"Destroy" : "Vernichten",
+ "Use regex" : "Regex verwenden",
"You have incoming share requests." : "Sie haben eingehende Freigabeanforderungen.",
- "If you want to the credential in a other vault," : "Wenn Sie zu einer anderen Anmeldeinformation in einem anderen Tresor möchten,",
+ "If you want to put the credential in a other vault," : "Falls Sie die Anmeldeinformation in einen andern Tresor übertragen möchten,",
"logout of this vault and login to the vault you want the shared credential in." : "melden Sie sich bei diesem Tresor ab und melde Sie sich bei dem Tresor, welches die geteilte Anmeldeinformation beinhaltet, wieder an.",
"Permissions" : "Rechte",
"Received from" : "Erhalten von",
"Date" : "Datum",
"Accept" : "Bestätigen",
"Decline" : "Ablehnen",
+ "You have {{session_time}} left before logout." : "Sie werden in {{session_time}} abgemeldet.",
"Last accessed" : "Letzter Zugriff",
"Never" : "Nie",
"No vaults found, why not create one?" : "Kein Tresor gefunden, warum kein neues erstellen?",
"Password strength must be at least: {{strength}}" : "Mindest erforderliche Passwortstärke: {{strength}}",
"Please give your new vault a name." : "Bitte einen Namen für den neuen Tresor eingeben.",
- "Vault password" : "Tresor-Passwort",
"Repeat vault password" : "Tresor-Passwort wiederholen",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Ihre Freigabeschlüssel werden 1024 bit stark sein. Sie können dies auch später noch in den Einstellungen ändern.",
"Create vault" : "Erstelle Tresor",
@@ -216,6 +219,7 @@
"Please input the password for" : "Passwort eingeben für",
"Set this vault as default." : "Diesen Tresor als Standard setzen.",
"Login automatically to this vault." : "Automatisch in diesen Tresor einloggen.",
+ "Logout of this vault automatically after: " : "Von diesem Tresor automatisch abmelden nach:",
"Decrypt vault" : "Tresor entschlüsseln",
"Warning! Adding credentials over http can be insecure!" : "Achtung! Zugangsdaten über http kann unsicher sein!",
"Logged in to {{vault_name}}" : "Eingeloggt in {{vault_name}}",
diff --git a/l10n/es.js b/l10n/es.js
index 028a4dd1..9b20f620 100644
--- a/l10n/es.js
+++ b/l10n/es.js
@@ -10,10 +10,12 @@ OC.L10N.register(
"Please fill in a label!" : "¡Por favor llene en una etiqueta!",
"Please fill in a value!" : "¡Por favor llene en un valor!",
"Error loading file" : "Error al cargar el archivo",
+ "An error happened during decryption" : "Un error sucedió durante el descifrado",
"Credential created!" : "¡Credencial creada!",
"Credential deleted" : "Credencial eliminada",
"Credential updated" : "Credencial actualziada",
"Credential recovered" : "Credencial recuperada",
+ "Credential destroyed" : "Credencial eliminada",
"Error downloading file, you probably don't have enough permissions" : "Error al descargar archivo, probablemente no tiene suficientes permisos",
"Starting export" : "Iniciar exportación",
"Decrypting credentials" : "Descifrando credenciales",
@@ -43,6 +45,10 @@ OC.L10N.register(
"Credential unshared" : "Dejo de compartir esta credencial",
"Credential shared" : "Ha compartido esta credencial",
"Saved!" : "¡Guardado!",
+ "Poor" : "Podre",
+ "Weak" : "Débil",
+ "Good" : "Buena",
+ "Strong" : "Fuerte",
"Toggle visibility" : "Visibilidad alterna",
"Copy to clipboard" : "Copiar a portapapeles",
"Copied to clipboard!" : "¡Copiado a portapapeles!",
@@ -105,6 +111,7 @@ OC.L10N.register(
"Bookmarklet" : "Marcadores",
"Save your passwords with 1 click!" : "¡Guarde sus contraseñas en 1 click!",
"Drag below button to your bookmark toolbar." : "Arrastre debajo del botón de marcadores en su barra de herramientas ",
+ "Vault password" : "Contraseña de bóveda",
"Import type" : "Tipo de importe",
"Import" : "Importar",
"Read progress" : "Progreso de lectura",
@@ -192,19 +199,21 @@ OC.L10N.register(
"Share" : "Compartir",
"Recover" : "Recuperar",
"Destroy" : "Destruir",
+ "Use regex" : "Use regex",
"You have incoming share requests." : "Tiene solicitudes de compartición entrantes",
- "If you want to the credential in a other vault," : "Si quiere compartir la credencial en otra bóveda,",
+ "If you want to put the credential in a other vault," : "Si desea poner la credencial en otra bóveda,",
"logout of this vault and login to the vault you want the shared credential in." : "cierre su sesión en esta bóveda e inicie sesión en la bóveda con la que quiere compartir la credencial.",
"Permissions" : "Permisos",
"Received from" : "Recibido de",
"Date" : "Fecha",
"Accept" : "Aceptar",
"Decline" : "Denegar",
+ "You have {{session_time}} left before logout." : "Tiene {{session_time}} antes del cierre de su sesión.",
"Last accessed" : "Último acceso",
"Never" : "Nunca",
"No vaults found, why not create one?" : "No se encontraron bóvedas, ¿porque no crear una?",
+ "Password strength must be at least: {{strength}}" : "La fuerza de la contraseña debe ser al menos de: {{strength}}",
"Please give your new vault a name." : "Por favor de nombre a su nueva bóveda.",
- "Vault password" : "Contraseña de bóveda",
"Repeat vault password" : "Repita contraseña de bóveda",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Su llave para compartir tendrá una fuerza de 1024bit, la cual puede cambiar después en los ajustes.",
"Create vault" : "Crear bóveda",
@@ -212,6 +221,7 @@ OC.L10N.register(
"Please input the password for" : "Por favor ingrese la contraseña para",
"Set this vault as default." : "Coloque esta bóveda como predeterminada.",
"Login automatically to this vault." : "Inicie sesión automáticamente para esta bóveda.",
+ "Logout of this vault automatically after: " : "Salir de esta bóveda automáticamente después de:",
"Decrypt vault" : "Descifre bóveda",
"Warning! Adding credentials over http can be insecure!" : "¡Advertencia! ¡Agregar credenciales sobre http puede ser inseguro!",
"Logged in to {{vault_name}}" : "Sesión iniciada en {{vault_name}}",
@@ -223,6 +233,7 @@ OC.L10N.register(
"Click here to request it" : "Haga click aquí para solicitar",
"Loading..." : "Cargando...",
"Awwhh.... credential not found. Maybe it expired" : "Oh oh... la credencial no se encontró. Tal vez esta expiró",
+ "Error while saving field" : "Error mientras se guardaba el campo",
"A Passman item has been created, modified or deleted" : "Un objeto Passman puede ser creado, modificado o borrado",
"A Passman item has expired" : "Un objeto Passman ha expirado",
"A Passman item has been shared" : "Un objeto Passman ha sido compartido",
@@ -251,6 +262,15 @@ OC.L10N.register(
"%s shared \"%s\" with you. Click here to accept" : "%s comparte \"%s\" contigo. Hacer click aquí para aceptar",
"%s has declined your share request for \"%s\"." : "%s ha rechazado su petición para compartir \"%s\".",
"%s has accepted your share request for \"%s\"." : "%s ha aceptado tu petición para compartir \"%s\".",
+ "Unable to get version info" : "Incapaz de obtener la información de la versión",
+ "Passman Settings" : "Ajustes de Passman",
+ "Github version:" : "Versión de Github:",
+ "A newer version of passman is available" : "Una nueva versión de passman está disponible",
+ "Allow users on this server to share passwords with a link" : "Permitir usuarios de este servidor compartir contraseñas con un enlace",
+ "Allow users on this server to share passwords with other users" : "Permitir usuarios en este servidor compartir contraseñas con otros usuarios",
+ "Check for new versions" : "Revisar por nuevas versiones",
+ "Enable HTTPS check" : "Activar revisión HTTPS",
+ "Disable context menu" : "Deshabilitar menú contextual",
"Connection to server lost" : "Perdida la conexión al server",
"Problem loading page, reloading in 5 seconds" : "Problema al cargar la página, recargando en 5 segundos",
"Saving..." : "Guardando...",
diff --git a/l10n/es.json b/l10n/es.json
index 94de08f0..c2004023 100644
--- a/l10n/es.json
+++ b/l10n/es.json
@@ -8,10 +8,12 @@
"Please fill in a label!" : "¡Por favor llene en una etiqueta!",
"Please fill in a value!" : "¡Por favor llene en un valor!",
"Error loading file" : "Error al cargar el archivo",
+ "An error happened during decryption" : "Un error sucedió durante el descifrado",
"Credential created!" : "¡Credencial creada!",
"Credential deleted" : "Credencial eliminada",
"Credential updated" : "Credencial actualziada",
"Credential recovered" : "Credencial recuperada",
+ "Credential destroyed" : "Credencial eliminada",
"Error downloading file, you probably don't have enough permissions" : "Error al descargar archivo, probablemente no tiene suficientes permisos",
"Starting export" : "Iniciar exportación",
"Decrypting credentials" : "Descifrando credenciales",
@@ -41,6 +43,10 @@
"Credential unshared" : "Dejo de compartir esta credencial",
"Credential shared" : "Ha compartido esta credencial",
"Saved!" : "¡Guardado!",
+ "Poor" : "Podre",
+ "Weak" : "Débil",
+ "Good" : "Buena",
+ "Strong" : "Fuerte",
"Toggle visibility" : "Visibilidad alterna",
"Copy to clipboard" : "Copiar a portapapeles",
"Copied to clipboard!" : "¡Copiado a portapapeles!",
@@ -103,6 +109,7 @@
"Bookmarklet" : "Marcadores",
"Save your passwords with 1 click!" : "¡Guarde sus contraseñas en 1 click!",
"Drag below button to your bookmark toolbar." : "Arrastre debajo del botón de marcadores en su barra de herramientas ",
+ "Vault password" : "Contraseña de bóveda",
"Import type" : "Tipo de importe",
"Import" : "Importar",
"Read progress" : "Progreso de lectura",
@@ -190,19 +197,21 @@
"Share" : "Compartir",
"Recover" : "Recuperar",
"Destroy" : "Destruir",
+ "Use regex" : "Use regex",
"You have incoming share requests." : "Tiene solicitudes de compartición entrantes",
- "If you want to the credential in a other vault," : "Si quiere compartir la credencial en otra bóveda,",
+ "If you want to put the credential in a other vault," : "Si desea poner la credencial en otra bóveda,",
"logout of this vault and login to the vault you want the shared credential in." : "cierre su sesión en esta bóveda e inicie sesión en la bóveda con la que quiere compartir la credencial.",
"Permissions" : "Permisos",
"Received from" : "Recibido de",
"Date" : "Fecha",
"Accept" : "Aceptar",
"Decline" : "Denegar",
+ "You have {{session_time}} left before logout." : "Tiene {{session_time}} antes del cierre de su sesión.",
"Last accessed" : "Último acceso",
"Never" : "Nunca",
"No vaults found, why not create one?" : "No se encontraron bóvedas, ¿porque no crear una?",
+ "Password strength must be at least: {{strength}}" : "La fuerza de la contraseña debe ser al menos de: {{strength}}",
"Please give your new vault a name." : "Por favor de nombre a su nueva bóveda.",
- "Vault password" : "Contraseña de bóveda",
"Repeat vault password" : "Repita contraseña de bóveda",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Su llave para compartir tendrá una fuerza de 1024bit, la cual puede cambiar después en los ajustes.",
"Create vault" : "Crear bóveda",
@@ -210,6 +219,7 @@
"Please input the password for" : "Por favor ingrese la contraseña para",
"Set this vault as default." : "Coloque esta bóveda como predeterminada.",
"Login automatically to this vault." : "Inicie sesión automáticamente para esta bóveda.",
+ "Logout of this vault automatically after: " : "Salir de esta bóveda automáticamente después de:",
"Decrypt vault" : "Descifre bóveda",
"Warning! Adding credentials over http can be insecure!" : "¡Advertencia! ¡Agregar credenciales sobre http puede ser inseguro!",
"Logged in to {{vault_name}}" : "Sesión iniciada en {{vault_name}}",
@@ -221,6 +231,7 @@
"Click here to request it" : "Haga click aquí para solicitar",
"Loading..." : "Cargando...",
"Awwhh.... credential not found. Maybe it expired" : "Oh oh... la credencial no se encontró. Tal vez esta expiró",
+ "Error while saving field" : "Error mientras se guardaba el campo",
"A Passman item has been created, modified or deleted" : "Un objeto Passman puede ser creado, modificado o borrado",
"A Passman item has expired" : "Un objeto Passman ha expirado",
"A Passman item has been shared" : "Un objeto Passman ha sido compartido",
@@ -249,6 +260,15 @@
"%s shared \"%s\" with you. Click here to accept" : "%s comparte \"%s\" contigo. Hacer click aquí para aceptar",
"%s has declined your share request for \"%s\"." : "%s ha rechazado su petición para compartir \"%s\".",
"%s has accepted your share request for \"%s\"." : "%s ha aceptado tu petición para compartir \"%s\".",
+ "Unable to get version info" : "Incapaz de obtener la información de la versión",
+ "Passman Settings" : "Ajustes de Passman",
+ "Github version:" : "Versión de Github:",
+ "A newer version of passman is available" : "Una nueva versión de passman está disponible",
+ "Allow users on this server to share passwords with a link" : "Permitir usuarios de este servidor compartir contraseñas con un enlace",
+ "Allow users on this server to share passwords with other users" : "Permitir usuarios en este servidor compartir contraseñas con otros usuarios",
+ "Check for new versions" : "Revisar por nuevas versiones",
+ "Enable HTTPS check" : "Activar revisión HTTPS",
+ "Disable context menu" : "Deshabilitar menú contextual",
"Connection to server lost" : "Perdida la conexión al server",
"Problem loading page, reloading in 5 seconds" : "Problema al cargar la página, recargando en 5 segundos",
"Saving..." : "Guardando...",
diff --git a/l10n/fr.js b/l10n/fr.js
index 51716ae3..8fcdc802 100644
--- a/l10n/fr.js
+++ b/l10n/fr.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"Credential deleted" : "Information d'identification supprimée",
"Credential updated" : "Information d'identification mise à jour",
"Credential recovered" : "Information d'identification récupérée",
+ "Credential destroyed" : "Information d'identification détruite",
"Error downloading file, you probably don't have enough permissions" : "Erreur lors du téléchargement du fichier, vous ne devez sans doute pas avoir toutes les autorisations",
"Starting export" : "Démarrage de l'export",
"Decrypting credentials" : "Décryptage des informations d'identification",
@@ -58,6 +59,8 @@ OC.L10N.register(
"Username" : "Nom d'utilisateur",
"Repeat password" : "Répéter le mot de passe",
"Add Tag" : "Ajouter une étiquette",
+ "Field label" : "Étiquette du champ",
+ "Field value" : "Valeur du champ",
"Choose a file" : "Choisir un fichier",
"Text" : "Texte",
"File" : "Fichier",
@@ -69,6 +72,7 @@ OC.L10N.register(
"Filename" : "Nom de fichier",
"Upload date" : "Date du téléversement",
"Size" : "Taille",
+ "Upload your OTP qr code" : "Téléverser votre code QR OTP",
"Current OTP settings" : "Paramètres du mot de passe OTP actuel",
"Issuer" : "Émetteur",
"Secret" : "Secret",
@@ -107,6 +111,7 @@ OC.L10N.register(
"Bookmarklet" : "Bookmarklet",
"Save your passwords with 1 click!" : "Sauvegardez vos mots de passe en 1 clic !",
"Drag below button to your bookmark toolbar." : "Glissez le bouton ci-dessous dans la barre d'outils de vos favoris.",
+ "Vault password" : "Mot de passe du coffre-fort",
"Import type" : "Type d'importation",
"Import" : "Importer",
"Read progress" : "Lire l'avancement",
@@ -127,6 +132,7 @@ OC.L10N.register(
"Cyphering" : "Chiffrement",
"Uploading" : "Téléversement",
"User" : "Utilisateur",
+ "Crypto time" : "Temps d'encodage",
"Total time spent cyphering" : "Temps total passé à chiffrer",
"Read" : "Lecture",
"Write" : "Écriture",
@@ -135,17 +141,30 @@ OC.L10N.register(
"Pending" : "En attente",
"Enable link sharing" : "Activer le partage par lien",
"Share until date" : "Partage jusqu'à la date",
+ "Expire after views" : "Expire après plusieurs visualisations",
+ "Click share first" : "Premier partage par clic",
"Show files" : "Afficher les fichiers",
"Details" : "Détails",
"Hide details" : "Cacher les détails",
+ "Password score" : "Évaluation du mot de passe",
+ "Cracking times" : "Temps pour hacker",
"100 / hour" : "100 / heure",
+ "Throttled online attack" : "Attaque en ligne minimisée",
"10 / second" : "10 / seconde",
+ "Unthrottled online attack" : "Attaque en ligne non minimisée",
"10k / second" : "10k / seconde",
+ "Offline attack, slow hash, many cores" : "Attaque hors-ligne, hachage lent, plusieurs cœurs",
"10B / second" : "10B / seconde",
+ "Offline attack, fast hash, many cores" : "Attaque hors-ligne, hachage rapide, plusieurs cœurs",
+ "Match sequence" : "Séquence correspondante",
+ "See match sequence" : "Voir la séquence qui correspond",
"Pattern" : "Modèle",
+ "Matched word" : "Mot trouvé",
"Dictionary name" : "Nom du dictionnaire",
"Rank" : "Rang",
"Reversed" : "Inversé",
+ "Guesses" : "Suppositions",
+ "Base guesses" : "Hypothèses fondées",
"Uppercase variations" : "Variations en majuscules",
"l33t-variations" : "Variations l33t",
"Showing revisions of" : "Montrer les révisions de",
@@ -163,6 +182,8 @@ OC.L10N.register(
"Share credential {{credential}}" : "Partage l'information d'identification {{credential}}",
"Unshare" : "Ne plus partager",
"Showing deleted since" : "Montrer ceux supprimés depuis",
+ "All time" : "Tout le temps",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "Affiche {{number_filtered}} sur {{credential_number}} informations d'identification",
"Search credential..." : "Rechercher l'information d'identification...",
"Account" : "Compte",
"Password" : "Mot de passe",
@@ -178,20 +199,21 @@ OC.L10N.register(
"Share" : "Partager",
"Recover" : "Restaurer",
"Destroy" : "Détruire",
+ "Use regex" : "Utiliser une expression réguière",
"You have incoming share requests." : "Vous avez des nouvelles demandes de partage.",
- "If you want to the credential in a other vault," : "Si vous souhaitez obtenir les informations d'identification dans un autre coffre-fort,",
+ "If you want to put the credential in a other vault," : "Si vous souhaitez déplacer les informations d'identification dans un autre coffre-fort,",
"logout of this vault and login to the vault you want the shared credential in." : "déconnectez-vous de ce coffre-fort et connectez-vous au coffre-fort dans lequel vous voulez les informations d'identification partagées.",
"Permissions" : "Permissions",
"Received from" : "Reçu de",
"Date" : "Date",
"Accept" : "Accepter",
"Decline" : "Refuser",
+ "You have {{session_time}} left before logout." : "Il vous reste {{session_time}} avant d'être déconnecté.",
"Last accessed" : "Dernier accès",
"Never" : "Jamais",
"No vaults found, why not create one?" : "Pas de coffre-fort trouvé, pourquoi ne pas en créer un ?",
"Password strength must be at least: {{strength}}" : "La force du mot de passe doit être au moins : {{strength}}",
"Please give your new vault a name." : "Veuillez donner un nom à votre nouveau coffre-fort.",
- "Vault password" : "Mot de passe du coffre-fort",
"Repeat vault password" : "Confirmer le mot de passe du coffre-fort",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Votre clé de partage aura un poids de 1024 octet, ce qui pourra être modifié plus tard dans les paramètres.",
"Create vault" : "Créer un coffre-fort",
@@ -199,6 +221,7 @@ OC.L10N.register(
"Please input the password for" : "Veuillez entrer le mot de passe pour",
"Set this vault as default." : "Choisir ce coffre-fort par défaut.",
"Login automatically to this vault." : "Se connecter automatiquement à ce coffre-fort.",
+ "Logout of this vault automatically after: " : "Se déconnecter de ce coffre-fort automatiquement après :",
"Decrypt vault" : "Déchiffrer le coffre-fort",
"Warning! Adding credentials over http can be insecure!" : "Attention ! Ajouter des informations d'identification en http peut être insécurisé !",
"Logged in to {{vault_name}}" : "Connecté à {{vault_name}}",
@@ -247,6 +270,7 @@ OC.L10N.register(
"Allow users on this server to share passwords with other users" : "Autoriser les utilisateurs de ce serveur à partager des mots de passe avec d'autres utilisateurs",
"Check for new versions" : "Vérifier la présence de nouvelles versions",
"Enable HTTPS check" : "Activer la vérification HTTPS",
+ "Disable context menu" : "Désactiver le menu contextuel",
"Connection to server lost" : "Connexion au serveur perdu",
"Problem loading page, reloading in 5 seconds" : "Problème de chargement de la page, actualisation dans 5 secondes",
"Saving..." : "Enregistrement…",
diff --git a/l10n/fr.json b/l10n/fr.json
index 4056c74c..5650e340 100644
--- a/l10n/fr.json
+++ b/l10n/fr.json
@@ -13,6 +13,7 @@
"Credential deleted" : "Information d'identification supprimée",
"Credential updated" : "Information d'identification mise à jour",
"Credential recovered" : "Information d'identification récupérée",
+ "Credential destroyed" : "Information d'identification détruite",
"Error downloading file, you probably don't have enough permissions" : "Erreur lors du téléchargement du fichier, vous ne devez sans doute pas avoir toutes les autorisations",
"Starting export" : "Démarrage de l'export",
"Decrypting credentials" : "Décryptage des informations d'identification",
@@ -56,6 +57,8 @@
"Username" : "Nom d'utilisateur",
"Repeat password" : "Répéter le mot de passe",
"Add Tag" : "Ajouter une étiquette",
+ "Field label" : "Étiquette du champ",
+ "Field value" : "Valeur du champ",
"Choose a file" : "Choisir un fichier",
"Text" : "Texte",
"File" : "Fichier",
@@ -67,6 +70,7 @@
"Filename" : "Nom de fichier",
"Upload date" : "Date du téléversement",
"Size" : "Taille",
+ "Upload your OTP qr code" : "Téléverser votre code QR OTP",
"Current OTP settings" : "Paramètres du mot de passe OTP actuel",
"Issuer" : "Émetteur",
"Secret" : "Secret",
@@ -105,6 +109,7 @@
"Bookmarklet" : "Bookmarklet",
"Save your passwords with 1 click!" : "Sauvegardez vos mots de passe en 1 clic !",
"Drag below button to your bookmark toolbar." : "Glissez le bouton ci-dessous dans la barre d'outils de vos favoris.",
+ "Vault password" : "Mot de passe du coffre-fort",
"Import type" : "Type d'importation",
"Import" : "Importer",
"Read progress" : "Lire l'avancement",
@@ -125,6 +130,7 @@
"Cyphering" : "Chiffrement",
"Uploading" : "Téléversement",
"User" : "Utilisateur",
+ "Crypto time" : "Temps d'encodage",
"Total time spent cyphering" : "Temps total passé à chiffrer",
"Read" : "Lecture",
"Write" : "Écriture",
@@ -133,17 +139,30 @@
"Pending" : "En attente",
"Enable link sharing" : "Activer le partage par lien",
"Share until date" : "Partage jusqu'à la date",
+ "Expire after views" : "Expire après plusieurs visualisations",
+ "Click share first" : "Premier partage par clic",
"Show files" : "Afficher les fichiers",
"Details" : "Détails",
"Hide details" : "Cacher les détails",
+ "Password score" : "Évaluation du mot de passe",
+ "Cracking times" : "Temps pour hacker",
"100 / hour" : "100 / heure",
+ "Throttled online attack" : "Attaque en ligne minimisée",
"10 / second" : "10 / seconde",
+ "Unthrottled online attack" : "Attaque en ligne non minimisée",
"10k / second" : "10k / seconde",
+ "Offline attack, slow hash, many cores" : "Attaque hors-ligne, hachage lent, plusieurs cœurs",
"10B / second" : "10B / seconde",
+ "Offline attack, fast hash, many cores" : "Attaque hors-ligne, hachage rapide, plusieurs cœurs",
+ "Match sequence" : "Séquence correspondante",
+ "See match sequence" : "Voir la séquence qui correspond",
"Pattern" : "Modèle",
+ "Matched word" : "Mot trouvé",
"Dictionary name" : "Nom du dictionnaire",
"Rank" : "Rang",
"Reversed" : "Inversé",
+ "Guesses" : "Suppositions",
+ "Base guesses" : "Hypothèses fondées",
"Uppercase variations" : "Variations en majuscules",
"l33t-variations" : "Variations l33t",
"Showing revisions of" : "Montrer les révisions de",
@@ -161,6 +180,8 @@
"Share credential {{credential}}" : "Partage l'information d'identification {{credential}}",
"Unshare" : "Ne plus partager",
"Showing deleted since" : "Montrer ceux supprimés depuis",
+ "All time" : "Tout le temps",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "Affiche {{number_filtered}} sur {{credential_number}} informations d'identification",
"Search credential..." : "Rechercher l'information d'identification...",
"Account" : "Compte",
"Password" : "Mot de passe",
@@ -176,20 +197,21 @@
"Share" : "Partager",
"Recover" : "Restaurer",
"Destroy" : "Détruire",
+ "Use regex" : "Utiliser une expression réguière",
"You have incoming share requests." : "Vous avez des nouvelles demandes de partage.",
- "If you want to the credential in a other vault," : "Si vous souhaitez obtenir les informations d'identification dans un autre coffre-fort,",
+ "If you want to put the credential in a other vault," : "Si vous souhaitez déplacer les informations d'identification dans un autre coffre-fort,",
"logout of this vault and login to the vault you want the shared credential in." : "déconnectez-vous de ce coffre-fort et connectez-vous au coffre-fort dans lequel vous voulez les informations d'identification partagées.",
"Permissions" : "Permissions",
"Received from" : "Reçu de",
"Date" : "Date",
"Accept" : "Accepter",
"Decline" : "Refuser",
+ "You have {{session_time}} left before logout." : "Il vous reste {{session_time}} avant d'être déconnecté.",
"Last accessed" : "Dernier accès",
"Never" : "Jamais",
"No vaults found, why not create one?" : "Pas de coffre-fort trouvé, pourquoi ne pas en créer un ?",
"Password strength must be at least: {{strength}}" : "La force du mot de passe doit être au moins : {{strength}}",
"Please give your new vault a name." : "Veuillez donner un nom à votre nouveau coffre-fort.",
- "Vault password" : "Mot de passe du coffre-fort",
"Repeat vault password" : "Confirmer le mot de passe du coffre-fort",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Votre clé de partage aura un poids de 1024 octet, ce qui pourra être modifié plus tard dans les paramètres.",
"Create vault" : "Créer un coffre-fort",
@@ -197,6 +219,7 @@
"Please input the password for" : "Veuillez entrer le mot de passe pour",
"Set this vault as default." : "Choisir ce coffre-fort par défaut.",
"Login automatically to this vault." : "Se connecter automatiquement à ce coffre-fort.",
+ "Logout of this vault automatically after: " : "Se déconnecter de ce coffre-fort automatiquement après :",
"Decrypt vault" : "Déchiffrer le coffre-fort",
"Warning! Adding credentials over http can be insecure!" : "Attention ! Ajouter des informations d'identification en http peut être insécurisé !",
"Logged in to {{vault_name}}" : "Connecté à {{vault_name}}",
@@ -245,6 +268,7 @@
"Allow users on this server to share passwords with other users" : "Autoriser les utilisateurs de ce serveur à partager des mots de passe avec d'autres utilisateurs",
"Check for new versions" : "Vérifier la présence de nouvelles versions",
"Enable HTTPS check" : "Activer la vérification HTTPS",
+ "Disable context menu" : "Désactiver le menu contextuel",
"Connection to server lost" : "Connexion au serveur perdu",
"Problem loading page, reloading in 5 seconds" : "Problème de chargement de la page, actualisation dans 5 secondes",
"Saving..." : "Enregistrement…",
diff --git a/l10n/it.js b/l10n/it.js
index c4044c06..28615192 100644
--- a/l10n/it.js
+++ b/l10n/it.js
@@ -110,6 +110,7 @@ OC.L10N.register(
"Bookmarklet" : "Bookmarklet",
"Save your passwords with 1 click!" : "Salva le tue password con 1 clic!",
"Drag below button to your bookmark toolbar." : "Trascina il pulsante seguente sulla barra degli strumenti.",
+ "Vault password" : "Password della cassaforte",
"Import type" : "Importa tipo",
"Import" : "Importa",
"Read progress" : "Avanzamento della lettura",
@@ -183,7 +184,6 @@ OC.L10N.register(
"Recover" : "Ripristina",
"Destroy" : "Distruggi",
"You have incoming share requests." : "Hai ricevuto delle richieste di condivisione.",
- "If you want to the credential in a other vault," : "Se vuoi condividere le credenziali con un'altra cassaforte,",
"logout of this vault and login to the vault you want the shared credential in." : "esci da questa cassaforte e accedi alla cassaforte con la quale vuoi condividere le credenziali.",
"Permissions" : "Permessi",
"Received from" : "Ricevute da",
@@ -195,7 +195,6 @@ OC.L10N.register(
"No vaults found, why not create one?" : "Nessuna cassaforte trovata, vuoi crearne una?",
"Password strength must be at least: {{strength}}" : "La robustezza della password deve essere almeno: {{strength}}",
"Please give your new vault a name." : "Dai un nome alla tua nuova cassaforte.",
- "Vault password" : "Password della cassaforte",
"Repeat vault password" : "Ripeti la password della cassaforte",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "La tua chiave di condivisione avrà una lunghezza di 1024 bit, che potrai modificare successivamente nelle impostazioni.",
"Create vault" : "Crea cassaforte",
diff --git a/l10n/it.json b/l10n/it.json
index 2f0e18bc..abd55a1a 100644
--- a/l10n/it.json
+++ b/l10n/it.json
@@ -108,6 +108,7 @@
"Bookmarklet" : "Bookmarklet",
"Save your passwords with 1 click!" : "Salva le tue password con 1 clic!",
"Drag below button to your bookmark toolbar." : "Trascina il pulsante seguente sulla barra degli strumenti.",
+ "Vault password" : "Password della cassaforte",
"Import type" : "Importa tipo",
"Import" : "Importa",
"Read progress" : "Avanzamento della lettura",
@@ -181,7 +182,6 @@
"Recover" : "Ripristina",
"Destroy" : "Distruggi",
"You have incoming share requests." : "Hai ricevuto delle richieste di condivisione.",
- "If you want to the credential in a other vault," : "Se vuoi condividere le credenziali con un'altra cassaforte,",
"logout of this vault and login to the vault you want the shared credential in." : "esci da questa cassaforte e accedi alla cassaforte con la quale vuoi condividere le credenziali.",
"Permissions" : "Permessi",
"Received from" : "Ricevute da",
@@ -193,7 +193,6 @@
"No vaults found, why not create one?" : "Nessuna cassaforte trovata, vuoi crearne una?",
"Password strength must be at least: {{strength}}" : "La robustezza della password deve essere almeno: {{strength}}",
"Please give your new vault a name." : "Dai un nome alla tua nuova cassaforte.",
- "Vault password" : "Password della cassaforte",
"Repeat vault password" : "Ripeti la password della cassaforte",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "La tua chiave di condivisione avrà una lunghezza di 1024 bit, che potrai modificare successivamente nelle impostazioni.",
"Create vault" : "Crea cassaforte",
diff --git a/l10n/nl.js b/l10n/nl.js
index 510ca435..21aa2f21 100644
--- a/l10n/nl.js
+++ b/l10n/nl.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"Credential deleted" : "Inloggegevens verwijderd",
"Credential updated" : "Inloggegevens bijgewerkt",
"Credential recovered" : "Inloggegevens hersteld",
+ "Credential destroyed" : "Inloggegevens vernietigd",
"Error downloading file, you probably don't have enough permissions" : "Fout bij downloaden bestand, je hebt waarschijnlijk niet genoeg rechten",
"Starting export" : "Starten export",
"Decrypting credentials" : "Ontsleutelen inloggegevens",
@@ -110,6 +111,7 @@ OC.L10N.register(
"Bookmarklet" : "Bookmarklet",
"Save your passwords with 1 click!" : "Bewaar je wachtwoorden met 1 klik!",
"Drag below button to your bookmark toolbar." : "Sleep onderstaande knop naar je bladwijzer balk.",
+ "Vault password" : "Kluiswachtwoord",
"Import type" : "Import type",
"Import" : "Importeren",
"Read progress" : "Lezen voortgang",
@@ -197,20 +199,21 @@ OC.L10N.register(
"Share" : "Delen",
"Recover" : "herstellen",
"Destroy" : "Vernietigen",
+ "Use regex" : "Gebruiken regex",
"You have incoming share requests." : "Je hebt binnengekomen deelverzoeken.",
- "If you want to the credential in a other vault," : "Als je de inloggegevens in een andere kluis wilt,",
+ "If you want to put the credential in a other vault," : "Als je de inloggegevens in een andere kluis wilt,",
"logout of this vault and login to the vault you want the shared credential in." : "log dan uit van deze kluis en login in de kluis waar je de gedeelde inloggegevens wilt bewaren.",
"Permissions" : "Permissies",
"Received from" : "Ontvangen van",
"Date" : "Datum",
"Accept" : "Accepteren",
"Decline" : "Afwijzen",
+ "You have {{session_time}} left before logout." : "Je hebt {{session_time}} over voor het uitloggen.",
"Last accessed" : "Laatst benaderd",
"Never" : "Nooit",
"No vaults found, why not create one?" : "Geen kluis gevonden, eentje aanmaken?",
"Password strength must be at least: {{strength}}" : "Wachtwoordsterkte minimale waarde: {{strength}}",
"Please give your new vault a name." : "Voer de naam van je nieuwe kluis in.",
- "Vault password" : "Kluiswachtwoord",
"Repeat vault password" : "Herhaal kluiswachtwoord",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "De deelsleutels hebben een sterkte van 1024 bit; dit kun je later in instellingen wijzigen.",
"Create vault" : "Creëren kluis",
@@ -218,6 +221,7 @@ OC.L10N.register(
"Please input the password for" : "Voer het wachtwoord in voor",
"Set this vault as default." : "Stel deze kluis als standaard in.",
"Login automatically to this vault." : "Log automatisch in in deze kluis.",
+ "Logout of this vault automatically after: " : "Automatisch van deze kluis uitloggen na:",
"Decrypt vault" : "Ontsleutel kluis",
"Warning! Adding credentials over http can be insecure!" : "Waarschuwing! Toevoegen van inloggegevens over http is riskant!",
"Logged in to {{vault_name}}" : "Ingelogd in {{vault_name}}",
diff --git a/l10n/nl.json b/l10n/nl.json
index 5d659de1..3292080b 100644
--- a/l10n/nl.json
+++ b/l10n/nl.json
@@ -13,6 +13,7 @@
"Credential deleted" : "Inloggegevens verwijderd",
"Credential updated" : "Inloggegevens bijgewerkt",
"Credential recovered" : "Inloggegevens hersteld",
+ "Credential destroyed" : "Inloggegevens vernietigd",
"Error downloading file, you probably don't have enough permissions" : "Fout bij downloaden bestand, je hebt waarschijnlijk niet genoeg rechten",
"Starting export" : "Starten export",
"Decrypting credentials" : "Ontsleutelen inloggegevens",
@@ -108,6 +109,7 @@
"Bookmarklet" : "Bookmarklet",
"Save your passwords with 1 click!" : "Bewaar je wachtwoorden met 1 klik!",
"Drag below button to your bookmark toolbar." : "Sleep onderstaande knop naar je bladwijzer balk.",
+ "Vault password" : "Kluiswachtwoord",
"Import type" : "Import type",
"Import" : "Importeren",
"Read progress" : "Lezen voortgang",
@@ -195,20 +197,21 @@
"Share" : "Delen",
"Recover" : "herstellen",
"Destroy" : "Vernietigen",
+ "Use regex" : "Gebruiken regex",
"You have incoming share requests." : "Je hebt binnengekomen deelverzoeken.",
- "If you want to the credential in a other vault," : "Als je de inloggegevens in een andere kluis wilt,",
+ "If you want to put the credential in a other vault," : "Als je de inloggegevens in een andere kluis wilt,",
"logout of this vault and login to the vault you want the shared credential in." : "log dan uit van deze kluis en login in de kluis waar je de gedeelde inloggegevens wilt bewaren.",
"Permissions" : "Permissies",
"Received from" : "Ontvangen van",
"Date" : "Datum",
"Accept" : "Accepteren",
"Decline" : "Afwijzen",
+ "You have {{session_time}} left before logout." : "Je hebt {{session_time}} over voor het uitloggen.",
"Last accessed" : "Laatst benaderd",
"Never" : "Nooit",
"No vaults found, why not create one?" : "Geen kluis gevonden, eentje aanmaken?",
"Password strength must be at least: {{strength}}" : "Wachtwoordsterkte minimale waarde: {{strength}}",
"Please give your new vault a name." : "Voer de naam van je nieuwe kluis in.",
- "Vault password" : "Kluiswachtwoord",
"Repeat vault password" : "Herhaal kluiswachtwoord",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "De deelsleutels hebben een sterkte van 1024 bit; dit kun je later in instellingen wijzigen.",
"Create vault" : "Creëren kluis",
@@ -216,6 +219,7 @@
"Please input the password for" : "Voer het wachtwoord in voor",
"Set this vault as default." : "Stel deze kluis als standaard in.",
"Login automatically to this vault." : "Log automatisch in in deze kluis.",
+ "Logout of this vault automatically after: " : "Automatisch van deze kluis uitloggen na:",
"Decrypt vault" : "Ontsleutel kluis",
"Warning! Adding credentials over http can be insecure!" : "Waarschuwing! Toevoegen van inloggegevens over http is riskant!",
"Logged in to {{vault_name}}" : "Ingelogd in {{vault_name}}",
diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js
index fee655d0..ce8af28b 100644
--- a/l10n/pt_BR.js
+++ b/l10n/pt_BR.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"Credential deleted" : "Credential excluída",
"Credential updated" : "Credencial atualizada",
"Credential recovered" : "Credencial recuperada",
+ "Credential destroyed" : "Credencial destruida",
"Error downloading file, you probably don't have enough permissions" : "Erro ao baixar o arquivo, você provavelmente não tem permissões suficientes",
"Starting export" : "Iniciando a exportação",
"Decrypting credentials" : "Credenciais de descriptografia",
@@ -110,6 +111,7 @@ OC.L10N.register(
"Bookmarklet" : "Marcado",
"Save your passwords with 1 click!" : "Salve suas senhas com um 1 clique!",
"Drag below button to your bookmark toolbar." : "Arraste o botão abaixo para a barra de ferramentas de marcadores.",
+ "Vault password" : "Senha do cofre",
"Import type" : "Tipo de importação",
"Import" : "Importar",
"Read progress" : "Leitura em progresso",
@@ -197,20 +199,21 @@ OC.L10N.register(
"Share" : "Compartilhar",
"Recover" : "Restaurar",
"Destroy" : "Destruir",
+ "Use regex" : "Usar regex",
"You have incoming share requests." : "Você tem solicitações de compartilhamento.",
- "If you want to the credential in a other vault," : "Se você quiser a credencial em um outro cofre,",
+ "If you want to put the credential in a other vault," : "Se você quiser colocar a credencial em um outro cofre,",
"logout of this vault and login to the vault you want the shared credential in." : "efetue o logout deste cofre e faça login no cofre ao qual você deseja que a credencial seja compartilhada.",
"Permissions" : "Permissões",
"Received from" : "Recebido de",
"Date" : "Data",
"Accept" : "Aceito",
"Decline" : "Declíne",
+ "You have {{session_time}} left before logout." : "Você tem {{session_time}} de espera antes de efetuar logout.",
"Last accessed" : "Último acessado",
"Never" : "Nunca",
"No vaults found, why not create one?" : "Nenhum cofre encontrado, por que não criar um?",
"Password strength must be at least: {{strength}}" : "A força da senha deve ser pelo menos: {{strength}}",
"Please give your new vault a name." : "Por favor, dê ao seu novo cofre um nome.",
- "Vault password" : "Senha do cofre",
"Repeat vault password" : "Repita a senha do cofre",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Sua chave de compartilhamento terá um grau de 1024 bits, que você pode alterar mais tarde nas configurações.",
"Create vault" : "Criar cofre",
@@ -218,6 +221,7 @@ OC.L10N.register(
"Please input the password for" : "Por favor entre uma senha para",
"Set this vault as default." : "Configure esse cofre como padrão.",
"Login automatically to this vault." : "Entrar automaticamente para este cofre.",
+ "Logout of this vault automatically after: " : "Efetue o logout desta solicitação logo após:",
"Decrypt vault" : "Descriptografar o cofre",
"Warning! Adding credentials over http can be insecure!" : "Atenção! Adicionar credenciais sobre http pode ser inseguro!",
"Logged in to {{vault_name}}" : "Efetuou login em {{vault_name}}",
diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json
index 420ac9f0..b9bfcf08 100644
--- a/l10n/pt_BR.json
+++ b/l10n/pt_BR.json
@@ -13,6 +13,7 @@
"Credential deleted" : "Credential excluída",
"Credential updated" : "Credencial atualizada",
"Credential recovered" : "Credencial recuperada",
+ "Credential destroyed" : "Credencial destruida",
"Error downloading file, you probably don't have enough permissions" : "Erro ao baixar o arquivo, você provavelmente não tem permissões suficientes",
"Starting export" : "Iniciando a exportação",
"Decrypting credentials" : "Credenciais de descriptografia",
@@ -108,6 +109,7 @@
"Bookmarklet" : "Marcado",
"Save your passwords with 1 click!" : "Salve suas senhas com um 1 clique!",
"Drag below button to your bookmark toolbar." : "Arraste o botão abaixo para a barra de ferramentas de marcadores.",
+ "Vault password" : "Senha do cofre",
"Import type" : "Tipo de importação",
"Import" : "Importar",
"Read progress" : "Leitura em progresso",
@@ -195,20 +197,21 @@
"Share" : "Compartilhar",
"Recover" : "Restaurar",
"Destroy" : "Destruir",
+ "Use regex" : "Usar regex",
"You have incoming share requests." : "Você tem solicitações de compartilhamento.",
- "If you want to the credential in a other vault," : "Se você quiser a credencial em um outro cofre,",
+ "If you want to put the credential in a other vault," : "Se você quiser colocar a credencial em um outro cofre,",
"logout of this vault and login to the vault you want the shared credential in." : "efetue o logout deste cofre e faça login no cofre ao qual você deseja que a credencial seja compartilhada.",
"Permissions" : "Permissões",
"Received from" : "Recebido de",
"Date" : "Data",
"Accept" : "Aceito",
"Decline" : "Declíne",
+ "You have {{session_time}} left before logout." : "Você tem {{session_time}} de espera antes de efetuar logout.",
"Last accessed" : "Último acessado",
"Never" : "Nunca",
"No vaults found, why not create one?" : "Nenhum cofre encontrado, por que não criar um?",
"Password strength must be at least: {{strength}}" : "A força da senha deve ser pelo menos: {{strength}}",
"Please give your new vault a name." : "Por favor, dê ao seu novo cofre um nome.",
- "Vault password" : "Senha do cofre",
"Repeat vault password" : "Repita a senha do cofre",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Sua chave de compartilhamento terá um grau de 1024 bits, que você pode alterar mais tarde nas configurações.",
"Create vault" : "Criar cofre",
@@ -216,6 +219,7 @@
"Please input the password for" : "Por favor entre uma senha para",
"Set this vault as default." : "Configure esse cofre como padrão.",
"Login automatically to this vault." : "Entrar automaticamente para este cofre.",
+ "Logout of this vault automatically after: " : "Efetue o logout desta solicitação logo após:",
"Decrypt vault" : "Descriptografar o cofre",
"Warning! Adding credentials over http can be insecure!" : "Atenção! Adicionar credenciais sobre http pode ser inseguro!",
"Logged in to {{vault_name}}" : "Efetuou login em {{vault_name}}",
diff --git a/l10n/ru.js b/l10n/ru.js
index 59e20606..69c563ba 100644
--- a/l10n/ru.js
+++ b/l10n/ru.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"Credential deleted" : "Реквизит удалён",
"Credential updated" : "Реквизит обновлен",
"Credential recovered" : "Реквизит восстановлен",
+ "Credential destroyed" : "Учетные данные уничтожены",
"Error downloading file, you probably don't have enough permissions" : "Ошибка скачивания файла, возможно у вас не достаточно прав доступа",
"Starting export" : "Начинается экспорт",
"Decrypting credentials" : "Расшифровка реквизитов",
@@ -110,6 +111,7 @@ OC.L10N.register(
"Bookmarklet" : "Приложение для панели закладок",
"Save your passwords with 1 click!" : "Сохраняйте свои пароли за 1 клик!",
"Drag below button to your bookmark toolbar." : "Перетащите кнопку, находящуюся ниже, на вашу панель закладок.",
+ "Vault password" : "Пароль хранилища",
"Import type" : "Тип импорта",
"Import" : "Импорт",
"Read progress" : "Ход чтения",
@@ -197,20 +199,21 @@ OC.L10N.register(
"Share" : "Поделиться",
"Recover" : "Восстановить",
"Destroy" : "Уничтожить",
+ "Use regex" : "Использовать регулярные выражения",
"You have incoming share requests." : "У вас входящий запрос на общий доступ.",
- "If you want to the credential in a other vault," : "Если вы хотите перейти к реквизитам их другого хранилища,",
+ "If you want to put the credential in a other vault," : "Если Вы хотите поместить учетные данные в другое хранилище,",
"logout of this vault and login to the vault you want the shared credential in." : "выйдите из этого хранилища и войдите в хранилище, которое содержит общие реквизиты.",
"Permissions" : "Права доступа",
"Received from" : "Получено от",
"Date" : "Дата",
"Accept" : "Принять",
"Decline" : "Отклонить",
+ "You have {{session_time}} left before logout." : "У вас осталось {{session_time}} до выхода.",
"Last accessed" : "Посл. доступ",
"Never" : "Никогда",
"No vaults found, why not create one?" : "Хранилищ не найдено, почему бы не создать?",
"Password strength must be at least: {{strength}}" : "Устойчивать пароля должна быть не ниже: {{strength}}",
"Please give your new vault a name." : "Укажите имя нового хранилища.",
- "Vault password" : "Пароль хранилища",
"Repeat vault password" : "Повторите пароль хранилища",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Ключ доступа будет иметь устойчивость 1024 бита, позже вы можете изменить ее в настройках.",
"Create vault" : "Создать хранилище",
@@ -218,6 +221,7 @@ OC.L10N.register(
"Please input the password for" : "Введите пароль для",
"Set this vault as default." : "Установить текущее хранилище хранилищем по-умолчанию.",
"Login automatically to this vault." : "Автоматически входить в это хранилище.",
+ "Logout of this vault automatically after: " : "Автоматически выходить из этого хранилища через:",
"Decrypt vault" : "Расшифровать хранилище",
"Warning! Adding credentials over http can be insecure!" : "Предупреждение! Добавление реквизитов с использованием протокола http может быть небезопасно!",
"Logged in to {{vault_name}}" : "Вошли в {{vault_name}}",
diff --git a/l10n/ru.json b/l10n/ru.json
index b0b79c9c..fdb7f380 100644
--- a/l10n/ru.json
+++ b/l10n/ru.json
@@ -13,6 +13,7 @@
"Credential deleted" : "Реквизит удалён",
"Credential updated" : "Реквизит обновлен",
"Credential recovered" : "Реквизит восстановлен",
+ "Credential destroyed" : "Учетные данные уничтожены",
"Error downloading file, you probably don't have enough permissions" : "Ошибка скачивания файла, возможно у вас не достаточно прав доступа",
"Starting export" : "Начинается экспорт",
"Decrypting credentials" : "Расшифровка реквизитов",
@@ -108,6 +109,7 @@
"Bookmarklet" : "Приложение для панели закладок",
"Save your passwords with 1 click!" : "Сохраняйте свои пароли за 1 клик!",
"Drag below button to your bookmark toolbar." : "Перетащите кнопку, находящуюся ниже, на вашу панель закладок.",
+ "Vault password" : "Пароль хранилища",
"Import type" : "Тип импорта",
"Import" : "Импорт",
"Read progress" : "Ход чтения",
@@ -195,20 +197,21 @@
"Share" : "Поделиться",
"Recover" : "Восстановить",
"Destroy" : "Уничтожить",
+ "Use regex" : "Использовать регулярные выражения",
"You have incoming share requests." : "У вас входящий запрос на общий доступ.",
- "If you want to the credential in a other vault," : "Если вы хотите перейти к реквизитам их другого хранилища,",
+ "If you want to put the credential in a other vault," : "Если Вы хотите поместить учетные данные в другое хранилище,",
"logout of this vault and login to the vault you want the shared credential in." : "выйдите из этого хранилища и войдите в хранилище, которое содержит общие реквизиты.",
"Permissions" : "Права доступа",
"Received from" : "Получено от",
"Date" : "Дата",
"Accept" : "Принять",
"Decline" : "Отклонить",
+ "You have {{session_time}} left before logout." : "У вас осталось {{session_time}} до выхода.",
"Last accessed" : "Посл. доступ",
"Never" : "Никогда",
"No vaults found, why not create one?" : "Хранилищ не найдено, почему бы не создать?",
"Password strength must be at least: {{strength}}" : "Устойчивать пароля должна быть не ниже: {{strength}}",
"Please give your new vault a name." : "Укажите имя нового хранилища.",
- "Vault password" : "Пароль хранилища",
"Repeat vault password" : "Повторите пароль хранилища",
"Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Ключ доступа будет иметь устойчивость 1024 бита, позже вы можете изменить ее в настройках.",
"Create vault" : "Создать хранилище",
@@ -216,6 +219,7 @@
"Please input the password for" : "Введите пароль для",
"Set this vault as default." : "Установить текущее хранилище хранилищем по-умолчанию.",
"Login automatically to this vault." : "Автоматически входить в это хранилище.",
+ "Logout of this vault automatically after: " : "Автоматически выходить из этого хранилища через:",
"Decrypt vault" : "Расшифровать хранилище",
"Warning! Adding credentials over http can be insecure!" : "Предупреждение! Добавление реквизитов с использованием протокола http может быть небезопасно!",
"Logged in to {{vault_name}}" : "Вошли в {{vault_name}}",
diff --git a/l10n/sv.js b/l10n/sv.js
new file mode 100644
index 00000000..18c91efc
--- /dev/null
+++ b/l10n/sv.js
@@ -0,0 +1,275 @@
+OC.L10N.register(
+ "passman",
+ {
+ "Passwords" : "Lösenord",
+ "Generating sharing keys ( %step / 2)" : "Genererar delningsnycklar ( %step / 2)",
+ "Incorrect vault password!" : "Felaktigt valv-lösenord!",
+ "Passwords do not match" : "Lösenorden matchar inte",
+ "General" : "Allmänt",
+ "Custom Fields" : "Anpassade Fält",
+ "Please fill in a label!" : "Fyll i en etikett!",
+ "Please fill in a value!" : "Fyll i ett värde!",
+ "Error loading file" : "Fel vid inläsning av fil",
+ "An error happened during decryption" : "Ett fel uppstod vid dekryptering",
+ "Credential created!" : "Uppgifter skapade!",
+ "Credential deleted" : "Uppgifterna borttagna",
+ "Credential updated" : "Uppgifterna uppdaterade",
+ "Credential recovered" : "Uppgifterna åtställda",
+ "Error downloading file, you probably don't have enough permissions" : "Fel vid hämtning av filer, du har förmodligen inte tillräckliga behörigheter",
+ "Starting export" : "Påbörjar exportering",
+ "Decrypting credentials" : "Dekrypterar uppgifterna",
+ "Done" : "Klar",
+ "File read successfully!" : "Inläsning av fil lyckades!",
+ "Credential has no label, skipping" : "Uppgifterna saknar etikett, skippar",
+ "Adding {{credential}}" : "Lägger till {{credential}}",
+ "Added {{credential}}" : "La till {{credential}}",
+ "Parsed {{num}} credentials, starting to import" : "Analyserade {{num}} uppgifter, börjar importera",
+ "Revision deleted" : "Granskning raderad",
+ "Revision restored" : "Granskning återställd",
+ "Save in passman" : "Spara i passman",
+ "Settings saved" : "Inställningar sparade",
+ "General settings" : "Allmänna inställningar",
+ "Password Audit" : "Lösenordsgranskning",
+ "Password settings" : "Lösenordsinställningar",
+ "Import credentials" : "Importera uppgifter",
+ "Export credentials" : "Exportera uppgifter",
+ "Sharing" : "Delar",
+ "Are you sure you want to leave? This WILL corrupt all your credentials" : "Är du säker på att du vill lämna? Detta kommer att förstöra alla dina uppgifter",
+ "Your old password is incorrect!" : "Ditt gamla lösenord är fel!",
+ "New passwords do not match!" : "Nya lösenorden matchar inte!",
+ "Please login with your new vault password" : "Logga in med ditt nya lösenord",
+ "Share with users and groups" : "Dela med användare och grupper",
+ "Share link" : "Dela länk",
+ "Are you sure you want to leave? This will corrupt this credential" : "Är du säker att du vill lämna? Detta kommer att fördärva uppgifterna",
+ "Credential unshared" : "Delning av uppgifter borttaget",
+ "Credential shared" : "Uppgifter delade",
+ "Saved!" : "Sparat!",
+ "Poor" : "Dåligt",
+ "Weak" : "Svag",
+ "Good" : "Bra",
+ "Strong" : "Starkt",
+ "Toggle visibility" : "Växla synlighet",
+ "Copy to clipboard" : "Kopiera till utklipp",
+ "Copied to clipboard!" : "Kopierat till utklipp!",
+ "Generate password" : "Generera lösenord",
+ "Copy password to clipboard" : "Kopiera lösenord till utklipp",
+ "Password copied to clipboard!" : "Lösenord kopierat till utklipp!",
+ "Complete" : "Färdigt",
+ "Username" : "Användarnamn",
+ "Repeat password" : "Repetera lösenord",
+ "Add Tag" : "Lägg till Tagg",
+ "Field label" : "Fältetikett",
+ "Field value" : "Fältvärde",
+ "Choose a file" : "Välj en fil",
+ "Text" : "Text",
+ "File" : "Fil",
+ "Add" : "Lägg till",
+ "Value" : "Värde",
+ "Type" : "Typ",
+ "Actions" : "Handlingar",
+ "Empty" : "Töm",
+ "Filename" : "Filnamn",
+ "Upload date" : "Uppladdningsdatum",
+ "Size" : "Storlek",
+ "Upload your OTP qr code" : "Ladda upp din OTP QR-kod",
+ "Current OTP settings" : "Nuvarande OTP-inställningar",
+ "Issuer" : "Utfärdare",
+ "Secret" : "Hemlighet",
+ "Expire date" : "Utgångsdatum",
+ "No expire date set" : "Inget utgångsdatum inställt",
+ "Renew interval" : "Förnya intervall",
+ "Disabled" : "Inaktiverad",
+ "Day(s)" : "Dag(ar)",
+ "Week(s)" : "Vecka(or)",
+ "Month(s)" : "Månad(er)",
+ "Year(s)" : "År (ett/flera)",
+ "Password generation settings" : "Inställningar för generering av lösenord",
+ "Password length" : "Lösenordslängd",
+ "Minimum amount of digits" : "Minsta antal tecken",
+ "Use uppercase letters" : "Använd stora bokstäver",
+ "Use lowercase letters" : "Använd små bokstäver",
+ "Use numbers" : "Använd nummer",
+ "Use special characters" : "Använd specialtecken",
+ "Avoid ambiguous characters" : "Undvik tvetydiga tecken",
+ "Require every character type" : "Kräv varje typ tecken",
+ "Export type" : "Exporteringstyp",
+ "Export" : "Exportera",
+ "Rename vault" : "Döp om valvet",
+ "New vault name" : "Nytt namn på valvet",
+ "Change" : "Ändra",
+ "Change vault key" : "Ändra valv-nyckel",
+ "Old vault password" : "Gammalt valv-lösenord",
+ "New vault password" : "Nytt valv-lösenord",
+ "New vault password repeat" : "Repetera nytt valv-lösenord",
+ "Please wait your vault is being updated, do not leave this page." : "Vänligen vänta, ditt valv håller på att uppdateras. Lämna inte denna sida!",
+ "Processing" : "Bearbetar",
+ "Total progress" : "Total framgång",
+ "About Passman" : "Om Passman",
+ "Version" : "Version",
+ "Donate to support development" : "Donera för att stödja utvecklingen",
+ "Bookmarklet" : "Bookmarklet",
+ "Save your passwords with 1 click!" : "Spara dina lösenord med 1 klick!",
+ "Drag below button to your bookmark toolbar." : "Dra knappen nedan till dina bokmärken",
+ "Vault password" : "Valv-lösenord",
+ "Import type" : "Importeringstyp",
+ "Import" : "Importera",
+ "Read progress" : "Läsningsframgång",
+ "Upload progress" : "Uppladdningsframgång",
+ "Private Key" : "Privat Nyckel",
+ "Public key" : "Offentlig Nyckel",
+ "Key size" : "Nyckelstorlek",
+ "Save keys" : "Spara nycklar",
+ "Generate sharing keys" : "Generera delningsnycklar",
+ "Generating sharing keys" : "Genererar delningsnycklar",
+ "The password tool will scan your password, calculate the avarage crack time and, if below the threshold, show them" : "Lösenordsverktyget kommer att skanna ditt lösenord och kalkylera hur lång tid det skulle ta att cracka det. Om det är lägre än vad som är godkänt så visas det.",
+ "Minimum password stength" : "Minsta lösenordsstyrka",
+ "Passman scanned your passwords, and here is the result." : "Passman har skannat dina lösenord och här är resultatet.",
+ "A total of {{scan_result}} weak credentials." : "Totalt {{scan_result}} svaga uppgifter.",
+ "Score" : "Poäng",
+ "Action" : "Action",
+ "Search users or groups..." : "Sök användare och grupper...",
+ "Cyphering" : "Cyphering",
+ "Uploading" : "Laddar upp",
+ "User" : "Användare",
+ "Crypto time" : "Krypteringstid",
+ "Total time spent cyphering" : "Total tid för cyphering",
+ "Read" : "Läs",
+ "Write" : "Skriv",
+ "Files" : "Filer",
+ "Revisions" : "Granskningar",
+ "Pending" : "Avvaktar",
+ "Enable link sharing" : "Aktivera delningslänkar",
+ "Share until date" : "Dela till datum",
+ "Expire after views" : "Upphör efter antal visningar",
+ "Click share first" : "Klicka dela först",
+ "Show files" : "Visa filer",
+ "Details" : "Detaljer",
+ "Hide details" : "Göm detaljer",
+ "Password score" : "Lösenordsstyrka",
+ "Cracking times" : "Cracking-tider",
+ "100 / hour" : "100 / timme",
+ "Throttled online attack" : "Strypt nätattack",
+ "10 / second" : "10 / sekund",
+ "Unthrottled online attack" : "Ostrypt nätattack",
+ "10k / second" : "10k / sekund",
+ "Offline attack, slow hash, many cores" : "Offline-attack, långsam hash, många kärnor",
+ "10B / second" : "10B / sekund",
+ "Offline attack, fast hash, many cores" : "Offline-attack, snabb hash, många kärnor",
+ "Match sequence" : "Matcha sekvens",
+ "See match sequence" : "Se matchande sekvens",
+ "Pattern" : "Mönster",
+ "Matched word" : "Matchande ord",
+ "Dictionary name" : "Ordlistans namn",
+ "Rank" : "Rang",
+ "Reversed" : "Reserverad",
+ "Guesses" : "Gissningar",
+ "Base guesses" : "Huvudgissningar",
+ "Uppercase variations" : "Stor bokstavsvariationer",
+ "l33t-variations" : "l33t-variationer",
+ "Showing revisions of" : "Visar granskningar av",
+ "Revision of" : "Granskning av",
+ "by" : "av",
+ "No revisions found." : "Inga granskningar hittades.",
+ "Label" : "Etikett",
+ "Restore revision" : "Återställ granskning",
+ "Delete revision" : "Radera granskning",
+ "Edit credential" : "Redigera uppgifter",
+ "Create new credential" : "Skapa nya uppgifter",
+ "Save" : "Spara",
+ "Cancel" : "Avbryt",
+ "Settings" : "Inställningar",
+ "Share credential {{credential}}" : "Dela uppgifter {{credential}}",
+ "Unshare" : "Ta bort delning",
+ "Showing deleted since" : "Visa raderade sedan",
+ "All time" : "All tid",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "Visar {{number_filtered}} av {{credential_number}} uppgifter",
+ "Search credential..." : "Sök uppgifter...",
+ "Account" : "Konto",
+ "Password" : "Lösenord",
+ "OTP" : "Engångslösenord",
+ "E-mail" : "E-post",
+ "URL" : "URL",
+ "Notes" : "Anteckningar",
+ "Expire time" : "Utgångsdatum",
+ "Changed" : "Ändrat",
+ "Created" : "Skapat",
+ "Edit" : "Redigera",
+ "Delete" : "Radera",
+ "Share" : "Dela",
+ "Recover" : "Återställ",
+ "Destroy" : "Förstör",
+ "You have incoming share requests." : "Du har inkommande delningsförfrågningar",
+ "logout of this vault and login to the vault you want the shared credential in." : "Logga ut från det här valvet och logga in i det valvet du vill ha de delade uppgifterna i.",
+ "Permissions" : "Behörigheter",
+ "Received from" : "Mottaget från",
+ "Date" : "Datum",
+ "Accept" : "Acceptera",
+ "Decline" : "Neka",
+ "Last accessed" : "Senast öppnad",
+ "Never" : "Aldrig",
+ "No vaults found, why not create one?" : "Inga valv hittades, varför inte skapa ett?",
+ "Password strength must be at least: {{strength}}" : "Lösenordslängden måste vara minst: {{strength}}",
+ "Please give your new vault a name." : "Ge ditt nya valv ett namn",
+ "Repeat vault password" : "Repetera valv-lösenord",
+ "Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Din delningsnycklar kommer att ha en styrka av 1024 bitar som du senare kan ändra i inställningar.",
+ "Create vault" : "Skapa valv",
+ "Go back to vaults" : "Gå tillbaka till valv",
+ "Please input the password for" : "Vänligen ange lösenordet för",
+ "Set this vault as default." : "Sätt detta valv som standard.",
+ "Login automatically to this vault." : "Logga in automatiskt till detta valv.",
+ "Decrypt vault" : "Dekryptera valv",
+ "Warning! Adding credentials over http can be insecure!" : "Varning! Att lägga till uppgifter över \"http\" kan vara osäkert!",
+ "Logged in to {{vault_name}}" : "Inloggad på {{vault_name}}",
+ "Change vault" : "Byt valv",
+ "Deleted credentials" : "Radera uppgifter",
+ "Logout" : "Logga ut",
+ "Donate" : "Donera",
+ "Someone has shared a credential with you." : "Någon delade uppgifter med dig",
+ "Click here to request it" : "Klicka här för att begära det",
+ "Loading..." : "Laddar...",
+ "Awwhh.... credential not found. Maybe it expired" : "Uppgifterna kunde inte hittas. Har de möjligtvis utgått?",
+ "Error while saving field" : "Fel vid sparande av fält",
+ "A Passman item has been created, modified or deleted" : "Ett Passman-objekt har skapats, ändrats eller raderats",
+ "A Passman item has expired" : "Ett Passman-objekt har utgått",
+ "A Passman item has been shared" : "Ett Passman-objekt har delats",
+ "A Passman item has been renamed" : "Ett Passman-objekt har döpts om",
+ "%1$s has been created by %2$s" : "%1$s har skapats av %2$s",
+ "You created %1$s" : "Du skapade %1$s",
+ "%1$s has been updated by %2$s" : "%1$s har blivit uppdaterad av %2$s",
+ "You updated %1$s" : "Du uppdaterade %1$s",
+ "%2$s has revised %1$s to the revision of %3$s" : "%2$s har korrigerat %1$s till granskningen av %3$s",
+ "You reverted %1$s back to the revision of %3$s" : "Du återställde %1$s tillbaka till granskningen av %3$s",
+ "%3$s has renamed %1$s to %2$s" : "%3$s har döpt om %1$s till %2$s",
+ "You renamed %1$s to %2$s" : "Du har döpt om %1$s till %2$s",
+ "%1$s has been deleted by %2$s" : "%1$s har raderats av %2$s",
+ "You deleted %1$s" : "Du raderade %1$s",
+ "%1$s has been recovered by %2$s" : "%1$s har blivit återställd av %2$s",
+ "You recovered %1$s" : "Du återställde %1$s",
+ "%1$s has been permanently deleted by %2$s" : "%1$s har blivit permanent raderad %2$s",
+ "You permanently deleted %1$s" : "Du raderade permanent %1$s",
+ "The password of %1$s has expired, renew it now." : "Lösenordet för %1$s har utgått, förnya det genast.",
+ "%1$s has been shared with %2$s" : "%1$s har delats med %2$s",
+ "You received a share request for %1$s from %2$s" : "Du har mottagit en delningsförfrågan av %1$s från %2$s",
+ "%s has been shared with a link" : "%s har delats som en länk",
+ "Your credential \"%s\" expired, click here to update the credential." : "Dina uppgifter \"%s\" har utgått, klicka här för att nya dessa.",
+ "Remind me later" : "Påminn mig senare",
+ "Ignore" : "Ignorera",
+ "%s shared \"%s\" with you. Click here to accept" : "%s delade \"%s\" med dig. Klicka här för att acceptera",
+ "%s has declined your share request for \"%s\"." : "%s har nekat din delningsförfrågan av \"%s\".",
+ "%s has accepted your share request for \"%s\"." : "%s har accepterad din delningsförfrågan av \"%s\".",
+ "Unable to get version info" : "Det gick inte att hitta information om version",
+ "Passman Settings" : "Passman Inställningar",
+ "Github version:" : "Github version:",
+ "A newer version of passman is available" : "En nyare version av passman finns tillgänglig",
+ "Allow users on this server to share passwords with a link" : "Tillåt användare på denna server att dela lösenord som en länk",
+ "Allow users on this server to share passwords with other users" : "Tillåt användare på denna server att dela lösenord med andra användare",
+ "Check for new versions" : "Sök efter ny version",
+ "Enable HTTPS check" : "Aktivera HTTPS-kontroll",
+ "Disable context menu" : "Inaktivera snabbmenyn",
+ "Connection to server lost" : "Anslutning till servern förlorad",
+ "Problem loading page, reloading in 5 seconds" : "Problem att ladda sidan, provar igen om 5 sekunder",
+ "Saving..." : "Sparar...",
+ "Dismiss" : "Avfärda",
+ "seconds ago" : "sekunder sedan"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/l10n/sv.json b/l10n/sv.json
new file mode 100644
index 00000000..3a5d3b0d
--- /dev/null
+++ b/l10n/sv.json
@@ -0,0 +1,273 @@
+{ "translations": {
+ "Passwords" : "Lösenord",
+ "Generating sharing keys ( %step / 2)" : "Genererar delningsnycklar ( %step / 2)",
+ "Incorrect vault password!" : "Felaktigt valv-lösenord!",
+ "Passwords do not match" : "Lösenorden matchar inte",
+ "General" : "Allmänt",
+ "Custom Fields" : "Anpassade Fält",
+ "Please fill in a label!" : "Fyll i en etikett!",
+ "Please fill in a value!" : "Fyll i ett värde!",
+ "Error loading file" : "Fel vid inläsning av fil",
+ "An error happened during decryption" : "Ett fel uppstod vid dekryptering",
+ "Credential created!" : "Uppgifter skapade!",
+ "Credential deleted" : "Uppgifterna borttagna",
+ "Credential updated" : "Uppgifterna uppdaterade",
+ "Credential recovered" : "Uppgifterna åtställda",
+ "Error downloading file, you probably don't have enough permissions" : "Fel vid hämtning av filer, du har förmodligen inte tillräckliga behörigheter",
+ "Starting export" : "Påbörjar exportering",
+ "Decrypting credentials" : "Dekrypterar uppgifterna",
+ "Done" : "Klar",
+ "File read successfully!" : "Inläsning av fil lyckades!",
+ "Credential has no label, skipping" : "Uppgifterna saknar etikett, skippar",
+ "Adding {{credential}}" : "Lägger till {{credential}}",
+ "Added {{credential}}" : "La till {{credential}}",
+ "Parsed {{num}} credentials, starting to import" : "Analyserade {{num}} uppgifter, börjar importera",
+ "Revision deleted" : "Granskning raderad",
+ "Revision restored" : "Granskning återställd",
+ "Save in passman" : "Spara i passman",
+ "Settings saved" : "Inställningar sparade",
+ "General settings" : "Allmänna inställningar",
+ "Password Audit" : "Lösenordsgranskning",
+ "Password settings" : "Lösenordsinställningar",
+ "Import credentials" : "Importera uppgifter",
+ "Export credentials" : "Exportera uppgifter",
+ "Sharing" : "Delar",
+ "Are you sure you want to leave? This WILL corrupt all your credentials" : "Är du säker på att du vill lämna? Detta kommer att förstöra alla dina uppgifter",
+ "Your old password is incorrect!" : "Ditt gamla lösenord är fel!",
+ "New passwords do not match!" : "Nya lösenorden matchar inte!",
+ "Please login with your new vault password" : "Logga in med ditt nya lösenord",
+ "Share with users and groups" : "Dela med användare och grupper",
+ "Share link" : "Dela länk",
+ "Are you sure you want to leave? This will corrupt this credential" : "Är du säker att du vill lämna? Detta kommer att fördärva uppgifterna",
+ "Credential unshared" : "Delning av uppgifter borttaget",
+ "Credential shared" : "Uppgifter delade",
+ "Saved!" : "Sparat!",
+ "Poor" : "Dåligt",
+ "Weak" : "Svag",
+ "Good" : "Bra",
+ "Strong" : "Starkt",
+ "Toggle visibility" : "Växla synlighet",
+ "Copy to clipboard" : "Kopiera till utklipp",
+ "Copied to clipboard!" : "Kopierat till utklipp!",
+ "Generate password" : "Generera lösenord",
+ "Copy password to clipboard" : "Kopiera lösenord till utklipp",
+ "Password copied to clipboard!" : "Lösenord kopierat till utklipp!",
+ "Complete" : "Färdigt",
+ "Username" : "Användarnamn",
+ "Repeat password" : "Repetera lösenord",
+ "Add Tag" : "Lägg till Tagg",
+ "Field label" : "Fältetikett",
+ "Field value" : "Fältvärde",
+ "Choose a file" : "Välj en fil",
+ "Text" : "Text",
+ "File" : "Fil",
+ "Add" : "Lägg till",
+ "Value" : "Värde",
+ "Type" : "Typ",
+ "Actions" : "Handlingar",
+ "Empty" : "Töm",
+ "Filename" : "Filnamn",
+ "Upload date" : "Uppladdningsdatum",
+ "Size" : "Storlek",
+ "Upload your OTP qr code" : "Ladda upp din OTP QR-kod",
+ "Current OTP settings" : "Nuvarande OTP-inställningar",
+ "Issuer" : "Utfärdare",
+ "Secret" : "Hemlighet",
+ "Expire date" : "Utgångsdatum",
+ "No expire date set" : "Inget utgångsdatum inställt",
+ "Renew interval" : "Förnya intervall",
+ "Disabled" : "Inaktiverad",
+ "Day(s)" : "Dag(ar)",
+ "Week(s)" : "Vecka(or)",
+ "Month(s)" : "Månad(er)",
+ "Year(s)" : "År (ett/flera)",
+ "Password generation settings" : "Inställningar för generering av lösenord",
+ "Password length" : "Lösenordslängd",
+ "Minimum amount of digits" : "Minsta antal tecken",
+ "Use uppercase letters" : "Använd stora bokstäver",
+ "Use lowercase letters" : "Använd små bokstäver",
+ "Use numbers" : "Använd nummer",
+ "Use special characters" : "Använd specialtecken",
+ "Avoid ambiguous characters" : "Undvik tvetydiga tecken",
+ "Require every character type" : "Kräv varje typ tecken",
+ "Export type" : "Exporteringstyp",
+ "Export" : "Exportera",
+ "Rename vault" : "Döp om valvet",
+ "New vault name" : "Nytt namn på valvet",
+ "Change" : "Ändra",
+ "Change vault key" : "Ändra valv-nyckel",
+ "Old vault password" : "Gammalt valv-lösenord",
+ "New vault password" : "Nytt valv-lösenord",
+ "New vault password repeat" : "Repetera nytt valv-lösenord",
+ "Please wait your vault is being updated, do not leave this page." : "Vänligen vänta, ditt valv håller på att uppdateras. Lämna inte denna sida!",
+ "Processing" : "Bearbetar",
+ "Total progress" : "Total framgång",
+ "About Passman" : "Om Passman",
+ "Version" : "Version",
+ "Donate to support development" : "Donera för att stödja utvecklingen",
+ "Bookmarklet" : "Bookmarklet",
+ "Save your passwords with 1 click!" : "Spara dina lösenord med 1 klick!",
+ "Drag below button to your bookmark toolbar." : "Dra knappen nedan till dina bokmärken",
+ "Vault password" : "Valv-lösenord",
+ "Import type" : "Importeringstyp",
+ "Import" : "Importera",
+ "Read progress" : "Läsningsframgång",
+ "Upload progress" : "Uppladdningsframgång",
+ "Private Key" : "Privat Nyckel",
+ "Public key" : "Offentlig Nyckel",
+ "Key size" : "Nyckelstorlek",
+ "Save keys" : "Spara nycklar",
+ "Generate sharing keys" : "Generera delningsnycklar",
+ "Generating sharing keys" : "Genererar delningsnycklar",
+ "The password tool will scan your password, calculate the avarage crack time and, if below the threshold, show them" : "Lösenordsverktyget kommer att skanna ditt lösenord och kalkylera hur lång tid det skulle ta att cracka det. Om det är lägre än vad som är godkänt så visas det.",
+ "Minimum password stength" : "Minsta lösenordsstyrka",
+ "Passman scanned your passwords, and here is the result." : "Passman har skannat dina lösenord och här är resultatet.",
+ "A total of {{scan_result}} weak credentials." : "Totalt {{scan_result}} svaga uppgifter.",
+ "Score" : "Poäng",
+ "Action" : "Action",
+ "Search users or groups..." : "Sök användare och grupper...",
+ "Cyphering" : "Cyphering",
+ "Uploading" : "Laddar upp",
+ "User" : "Användare",
+ "Crypto time" : "Krypteringstid",
+ "Total time spent cyphering" : "Total tid för cyphering",
+ "Read" : "Läs",
+ "Write" : "Skriv",
+ "Files" : "Filer",
+ "Revisions" : "Granskningar",
+ "Pending" : "Avvaktar",
+ "Enable link sharing" : "Aktivera delningslänkar",
+ "Share until date" : "Dela till datum",
+ "Expire after views" : "Upphör efter antal visningar",
+ "Click share first" : "Klicka dela först",
+ "Show files" : "Visa filer",
+ "Details" : "Detaljer",
+ "Hide details" : "Göm detaljer",
+ "Password score" : "Lösenordsstyrka",
+ "Cracking times" : "Cracking-tider",
+ "100 / hour" : "100 / timme",
+ "Throttled online attack" : "Strypt nätattack",
+ "10 / second" : "10 / sekund",
+ "Unthrottled online attack" : "Ostrypt nätattack",
+ "10k / second" : "10k / sekund",
+ "Offline attack, slow hash, many cores" : "Offline-attack, långsam hash, många kärnor",
+ "10B / second" : "10B / sekund",
+ "Offline attack, fast hash, many cores" : "Offline-attack, snabb hash, många kärnor",
+ "Match sequence" : "Matcha sekvens",
+ "See match sequence" : "Se matchande sekvens",
+ "Pattern" : "Mönster",
+ "Matched word" : "Matchande ord",
+ "Dictionary name" : "Ordlistans namn",
+ "Rank" : "Rang",
+ "Reversed" : "Reserverad",
+ "Guesses" : "Gissningar",
+ "Base guesses" : "Huvudgissningar",
+ "Uppercase variations" : "Stor bokstavsvariationer",
+ "l33t-variations" : "l33t-variationer",
+ "Showing revisions of" : "Visar granskningar av",
+ "Revision of" : "Granskning av",
+ "by" : "av",
+ "No revisions found." : "Inga granskningar hittades.",
+ "Label" : "Etikett",
+ "Restore revision" : "Återställ granskning",
+ "Delete revision" : "Radera granskning",
+ "Edit credential" : "Redigera uppgifter",
+ "Create new credential" : "Skapa nya uppgifter",
+ "Save" : "Spara",
+ "Cancel" : "Avbryt",
+ "Settings" : "Inställningar",
+ "Share credential {{credential}}" : "Dela uppgifter {{credential}}",
+ "Unshare" : "Ta bort delning",
+ "Showing deleted since" : "Visa raderade sedan",
+ "All time" : "All tid",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "Visar {{number_filtered}} av {{credential_number}} uppgifter",
+ "Search credential..." : "Sök uppgifter...",
+ "Account" : "Konto",
+ "Password" : "Lösenord",
+ "OTP" : "Engångslösenord",
+ "E-mail" : "E-post",
+ "URL" : "URL",
+ "Notes" : "Anteckningar",
+ "Expire time" : "Utgångsdatum",
+ "Changed" : "Ändrat",
+ "Created" : "Skapat",
+ "Edit" : "Redigera",
+ "Delete" : "Radera",
+ "Share" : "Dela",
+ "Recover" : "Återställ",
+ "Destroy" : "Förstör",
+ "You have incoming share requests." : "Du har inkommande delningsförfrågningar",
+ "logout of this vault and login to the vault you want the shared credential in." : "Logga ut från det här valvet och logga in i det valvet du vill ha de delade uppgifterna i.",
+ "Permissions" : "Behörigheter",
+ "Received from" : "Mottaget från",
+ "Date" : "Datum",
+ "Accept" : "Acceptera",
+ "Decline" : "Neka",
+ "Last accessed" : "Senast öppnad",
+ "Never" : "Aldrig",
+ "No vaults found, why not create one?" : "Inga valv hittades, varför inte skapa ett?",
+ "Password strength must be at least: {{strength}}" : "Lösenordslängden måste vara minst: {{strength}}",
+ "Please give your new vault a name." : "Ge ditt nya valv ett namn",
+ "Repeat vault password" : "Repetera valv-lösenord",
+ "Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Din delningsnycklar kommer att ha en styrka av 1024 bitar som du senare kan ändra i inställningar.",
+ "Create vault" : "Skapa valv",
+ "Go back to vaults" : "Gå tillbaka till valv",
+ "Please input the password for" : "Vänligen ange lösenordet för",
+ "Set this vault as default." : "Sätt detta valv som standard.",
+ "Login automatically to this vault." : "Logga in automatiskt till detta valv.",
+ "Decrypt vault" : "Dekryptera valv",
+ "Warning! Adding credentials over http can be insecure!" : "Varning! Att lägga till uppgifter över \"http\" kan vara osäkert!",
+ "Logged in to {{vault_name}}" : "Inloggad på {{vault_name}}",
+ "Change vault" : "Byt valv",
+ "Deleted credentials" : "Radera uppgifter",
+ "Logout" : "Logga ut",
+ "Donate" : "Donera",
+ "Someone has shared a credential with you." : "Någon delade uppgifter med dig",
+ "Click here to request it" : "Klicka här för att begära det",
+ "Loading..." : "Laddar...",
+ "Awwhh.... credential not found. Maybe it expired" : "Uppgifterna kunde inte hittas. Har de möjligtvis utgått?",
+ "Error while saving field" : "Fel vid sparande av fält",
+ "A Passman item has been created, modified or deleted" : "Ett Passman-objekt har skapats, ändrats eller raderats",
+ "A Passman item has expired" : "Ett Passman-objekt har utgått",
+ "A Passman item has been shared" : "Ett Passman-objekt har delats",
+ "A Passman item has been renamed" : "Ett Passman-objekt har döpts om",
+ "%1$s has been created by %2$s" : "%1$s har skapats av %2$s",
+ "You created %1$s" : "Du skapade %1$s",
+ "%1$s has been updated by %2$s" : "%1$s har blivit uppdaterad av %2$s",
+ "You updated %1$s" : "Du uppdaterade %1$s",
+ "%2$s has revised %1$s to the revision of %3$s" : "%2$s har korrigerat %1$s till granskningen av %3$s",
+ "You reverted %1$s back to the revision of %3$s" : "Du återställde %1$s tillbaka till granskningen av %3$s",
+ "%3$s has renamed %1$s to %2$s" : "%3$s har döpt om %1$s till %2$s",
+ "You renamed %1$s to %2$s" : "Du har döpt om %1$s till %2$s",
+ "%1$s has been deleted by %2$s" : "%1$s har raderats av %2$s",
+ "You deleted %1$s" : "Du raderade %1$s",
+ "%1$s has been recovered by %2$s" : "%1$s har blivit återställd av %2$s",
+ "You recovered %1$s" : "Du återställde %1$s",
+ "%1$s has been permanently deleted by %2$s" : "%1$s har blivit permanent raderad %2$s",
+ "You permanently deleted %1$s" : "Du raderade permanent %1$s",
+ "The password of %1$s has expired, renew it now." : "Lösenordet för %1$s har utgått, förnya det genast.",
+ "%1$s has been shared with %2$s" : "%1$s har delats med %2$s",
+ "You received a share request for %1$s from %2$s" : "Du har mottagit en delningsförfrågan av %1$s från %2$s",
+ "%s has been shared with a link" : "%s har delats som en länk",
+ "Your credential \"%s\" expired, click here to update the credential." : "Dina uppgifter \"%s\" har utgått, klicka här för att nya dessa.",
+ "Remind me later" : "Påminn mig senare",
+ "Ignore" : "Ignorera",
+ "%s shared \"%s\" with you. Click here to accept" : "%s delade \"%s\" med dig. Klicka här för att acceptera",
+ "%s has declined your share request for \"%s\"." : "%s har nekat din delningsförfrågan av \"%s\".",
+ "%s has accepted your share request for \"%s\"." : "%s har accepterad din delningsförfrågan av \"%s\".",
+ "Unable to get version info" : "Det gick inte att hitta information om version",
+ "Passman Settings" : "Passman Inställningar",
+ "Github version:" : "Github version:",
+ "A newer version of passman is available" : "En nyare version av passman finns tillgänglig",
+ "Allow users on this server to share passwords with a link" : "Tillåt användare på denna server att dela lösenord som en länk",
+ "Allow users on this server to share passwords with other users" : "Tillåt användare på denna server att dela lösenord med andra användare",
+ "Check for new versions" : "Sök efter ny version",
+ "Enable HTTPS check" : "Aktivera HTTPS-kontroll",
+ "Disable context menu" : "Inaktivera snabbmenyn",
+ "Connection to server lost" : "Anslutning till servern förlorad",
+ "Problem loading page, reloading in 5 seconds" : "Problem att ladda sidan, provar igen om 5 sekunder",
+ "Saving..." : "Sparar...",
+ "Dismiss" : "Avfärda",
+ "seconds ago" : "sekunder sedan"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/lib/Db/CredentialMapper.php b/lib/Db/CredentialMapper.php
index 5d3443f6..02d49ca8 100644
--- a/lib/Db/CredentialMapper.php
+++ b/lib/Db/CredentialMapper.php
@@ -29,6 +29,7 @@ use OCP\AppFramework\Db\Mapper;
class CredentialMapper extends Mapper {
private $utils;
+
public function __construct(IDBConnection $db, Utils $utils) {
parent::__construct($db, 'passman_credentials');
$this->utils = $utils;
@@ -37,9 +38,10 @@ class CredentialMapper extends Mapper {
/**
* Obtains the credentials by vault id (not guid)
+ *
* @throws \OCP\AppFramework\Db\DoesNotExistException if not found
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result
- * @return Vault[]
+ * @return Credential[]
*/
public function getCredentialsByVaultId($vault_id, $user_id) {
$sql = 'SELECT * FROM `*PREFIX*passman_credentials` ' .
@@ -49,6 +51,7 @@ class CredentialMapper extends Mapper {
/**
* Get a random credentail from a vault
+ *
* @param $vault_id
* @param $user_id
* @return Credential
@@ -57,58 +60,62 @@ class CredentialMapper extends Mapper {
$sql = 'SELECT * FROM `*PREFIX*passman_credentials` ' .
'WHERE `user_id` = ? and vault_id = ? AND shared_key is NULL LIMIT 20';
$entities = $this->findEntities($sql, [$user_id, $vault_id]);
- $count = count($entities)-1;
+ $count = count($entities) - 1;
$entities = array_splice($entities, rand(0, $count), 1);
return $entities;
}
/**
* Get expired credentials
+ *
* @param $timestamp
* @return Credential[]
*/
- public function getExpiredCredentials($timestamp){
+ public function getExpiredCredentials($timestamp) {
$sql = 'SELECT * FROM `*PREFIX*passman_credentials` ' .
'WHERE `expire_time` > 0 AND `expire_time` < ?';
return $this->findEntities($sql, [$timestamp]);
}
- /**
+ /**
* Get an credential by id.
* Optional user id
- * @param $credential_id
- * @param null $user_id
- * @return Credential
- */
- public function getCredentialById($credential_id, $user_id = null){
+ *
+ * @param $credential_id
+ * @param null $user_id
+ * @return Credential
+ */
+ public function getCredentialById($credential_id, $user_id = null) {
$sql = 'SELECT * FROM `*PREFIX*passman_credentials` ' .
'WHERE `id` = ?';
- // If we want to check the owner, add it to the query
+ // If we want to check the owner, add it to the query
$params = [$credential_id];
- if ($user_id !== null){
- $sql .= ' and `user_id` = ? ';
+ if ($user_id !== null) {
+ $sql .= ' and `user_id` = ? ';
array_push($params, $user_id);
}
- return $this->findEntity($sql,$params);
+ return $this->findEntity($sql, $params);
}
/**
* Get credential label by id
+ *
* @param $credential_id
* @return Credential
*/
- public function getCredentialLabelById($credential_id){
+ public function getCredentialLabelById($credential_id) {
$sql = 'SELECT id, label FROM `*PREFIX*passman_credentials` ' .
'WHERE `id` = ? ';
- return $this->findEntity($sql,[$credential_id]);
+ return $this->findEntity($sql, [$credential_id]);
}
/**
* Save credential to the database.
+ *
* @param $raw_credential
* @return Credential
*/
- public function create($raw_credential){
+ public function create($raw_credential) {
$credential = new Credential();
$credential->setGuid($this->utils->GUID());
@@ -131,7 +138,7 @@ class CredentialMapper extends Mapper {
$credential->setCustomFields($raw_credential['custom_fields']);
$credential->setOtp($raw_credential['otp']);
$credential->setHidden($raw_credential['hidden']);
- if(isset($raw_credential['shared_key'])) {
+ if (isset($raw_credential['shared_key'])) {
$credential->setSharedKey($raw_credential['shared_key']);
}
return parent::insert($credential);
@@ -139,10 +146,11 @@ class CredentialMapper extends Mapper {
/**
* Update a credential
+ *
* @param $raw_credential array An array containing all the credential fields
* @return Credential The updated credential
*/
- public function updateCredential($raw_credential){
+ public function updateCredential($raw_credential) {
$original = $this->getCredentialByGUID($raw_credential['guid']);
$credential = new Credential();
$credential->setId($original->getId());
@@ -166,30 +174,33 @@ class CredentialMapper extends Mapper {
$credential->setOtp($raw_credential['otp']);
$credential->setHidden($raw_credential['hidden']);
$credential->setDeleteTime($raw_credential['delete_time']);
- $credential->setSharedKey($raw_credential['shared_key']);
+ if (isset($raw_credential['shared_key'])) {
+ $credential->setSharedKey($raw_credential['shared_key']);
+ }
return parent::update($credential);
}
- public function deleteCredential(Credential $credential){
+ public function deleteCredential(Credential $credential) {
return $this->delete($credential);
}
- public function upd(Credential $credential){
+ public function upd(Credential $credential) {
$this->update($credential);
}
- /**
- * Finds a credential by the given guid
- * @param $credential_guid
- * @return Credential
- */
- public function getCredentialByGUID($credential_guid, $user_id = null){
- $q = 'SELECT * FROM `*PREFIX*passman_credentials` WHERE guid = ? ';
+ /**
+ * Finds a credential by the given guid
+ *
+ * @param $credential_guid
+ * @return Credential
+ */
+ public function getCredentialByGUID($credential_guid, $user_id = null) {
+ $q = 'SELECT * FROM `*PREFIX*passman_credentials` WHERE guid = ? ';
$params = [$credential_guid];
- if ($user_id !== null){
+ if ($user_id !== null) {
$q .= ' and `user_id` = ? ';
array_push($params, $user_id);
}
- return $this->findEntity($q, $params);
- }
+ return $this->findEntity($q, $params);
+ }
} \ No newline at end of file
diff --git a/lib/Db/VaultMapper.php b/lib/Db/VaultMapper.php
index 071bbd98..6844458c 100644
--- a/lib/Db/VaultMapper.php
+++ b/lib/Db/VaultMapper.php
@@ -120,4 +120,12 @@ class VaultMapper extends Mapper {
$vault->setSharingKeysGenerated($this->utils->getTime());
$this->update($vault);
}
+
+ /**
+ * Delete a vault
+ * @param Vault $vault
+ */
+ public function deleteVault(Vault $vault){
+ $this->delete($vault);
+ }
} \ No newline at end of file
diff --git a/lib/Service/CredentialRevisionService.php b/lib/Service/CredentialRevisionService.php
index 06113371..284fff74 100644
--- a/lib/Service/CredentialRevisionService.php
+++ b/lib/Service/CredentialRevisionService.php
@@ -33,13 +33,18 @@ use OCA\Passman\Db\CredentialRevisionMapper;
class CredentialRevisionService {
private $credentialRevisionMapper;
+ private $encryptService;
+ private $server_key;
- public function __construct(CredentialRevisionMapper $credentialRevisionMapper) {
+ public function __construct(CredentialRevisionMapper $credentialRevisionMapper, EncryptService $encryptService) {
$this->credentialRevisionMapper = $credentialRevisionMapper;
+ $this->encryptService = $encryptService;
+ $this->server_key = \OC::$server->getConfig()->getSystemValue('passwordsalt', '');
}
/**
* Create a new revision for a credential
+ *
* @param $credential
* @param $userId
* @param $credential_id
@@ -47,17 +52,25 @@ class CredentialRevisionService {
* @return CredentialRevision
*/
public function createRevision($credential, $userId, $credential_id, $edited_by) {
+ $credential = $this->encryptService->encryptCredential($credential);
return $this->credentialRevisionMapper->create($credential, $userId, $credential_id, $edited_by);
}
/**
* Get revisions of a credential
+ *
* @param $credential_id
* @param null $user_id
* @return CredentialRevision[]
*/
- public function getRevisions($credential_id, $user_id = null){
- return $this->credentialRevisionMapper->getRevisions($credential_id, $user_id);
+ public function getRevisions($credential_id, $user_id = null) {
+ $result = $this->credentialRevisionMapper->getRevisions($credential_id, $user_id);
+ foreach ($result as $index => $revision) {
+ $c = json_decode(base64_decode($revision->getCredentialData()), true);
+ $result[$index] = $revision->jsonSerialize();
+ $result[$index]['credential_data'] = $this->encryptService->decryptCredential($c);
+ }
+ return $result;
}
/**
@@ -66,26 +79,35 @@ class CredentialRevisionService {
* @param null $user_id
* @return CredentialRevision
*/
- public function getRevision($credential_id, $user_id = null){
- return $this->credentialRevisionMapper->getRevision($credential_id, $user_id);
+ public function getRevision($credential_id, $user_id = null) {
+ $revision = $this->credentialRevisionMapper->getRevision($credential_id, $user_id);
+ $c = json_decode(base64_decode($revision->getCredentialData()), true);
+ $revision->setCredentialData($this->encryptService->decryptCredential($c));
+ return $revision;
}
/**
* Delete a revision
+ *
* @param $revision_id
* @param $user_id
* @return CredentialRevision
*/
- public function deleteRevision($revision_id, $user_id){
+ public function deleteRevision($revision_id, $user_id) {
return $this->credentialRevisionMapper->deleteRevision($revision_id, $user_id);
}
/**
* Update revision
+ *
* @param CredentialRevision $credentialRevision
* @return CredentialRevision
*/
- public function updateRevision(CredentialRevision $credentialRevision){
+ public function updateRevision(CredentialRevision $credentialRevision) {
+ $credential_data = $credentialRevision->getCredentialData();
+ $credential_data = json_decode(base64_decode($credential_data), true);
+ $credential_data = base64_encode(json_encode($this->encryptService->encryptCredential($credential_data)));
+ $credentialRevision->setCredentialData($credential_data);
return $this->credentialRevisionMapper->update($credentialRevision);
}
} \ No newline at end of file
diff --git a/lib/Service/CredentialService.php b/lib/Service/CredentialService.php
index 9590bb0e..0bfa5c8e 100644
--- a/lib/Service/CredentialService.php
+++ b/lib/Service/CredentialService.php
@@ -36,116 +36,146 @@ use OCA\Passman\Db\CredentialMapper;
class CredentialService {
private $credentialMapper;
- private $sharingACL;
+ private $sharingACL;
+ private $encryptService;
+ private $server_key;
- public function __construct(CredentialMapper $credentialMapper, SharingACLMapper $sharingACL) {
+ public function __construct(CredentialMapper $credentialMapper, SharingACLMapper $sharingACL, EncryptService $encryptService) {
$this->credentialMapper = $credentialMapper;
- $this->sharingACL = $sharingACL;
+ $this->sharingACL = $sharingACL;
+ $this->encryptService = $encryptService;
+ $this->server_key = \OC::$server->getConfig()->getSystemValue('passwordsalt', '');
}
/**
* Create a new credential
- * @param $user_id
- * @param $item_guid
+ *
+ * @param array $credential
* @return Credential
*/
public function createCredential($credential) {
+ $credential = $this->encryptService->encryptCredential($credential);
return $this->credentialMapper->create($credential);
}
/**
* Update credential
+ *
* @param $credential array
* @return Credential
*/
public function updateCredential($credential) {
+ $credential = $this->encryptService->encryptCredential($credential);
return $this->credentialMapper->updateCredential($credential);
}
/**
* Update credential
+ *
* @param $credential Credential
+ * @return Credential
*/
public function upd(Credential $credential) {
- return $this->credentialMapper->upd($credential);
+ $credential = $this->encryptService->encryptCredential($credential);
+ return $this->credentialMapper->updateCredential($credential);
}
/**
* Delete credential
+ *
* @param Credential $credential
* @return \OCP\AppFramework\Db\Entity
*/
- public function deleteCredential(Credential $credential){
+ public function deleteCredential(Credential $credential) {
return $this->credentialMapper->deleteCredential($credential);
}
/**
* Get credentials by vault id
+ *
* @param $vault_id
* @param $user_id
- * @return \OCA\Passman\Db\Vault[]
+ * @return \OCA\Passman\Db\Credential[]
*/
public function getCredentialsByVaultId($vault_id, $user_id) {
- return $this->credentialMapper->getCredentialsByVaultId($vault_id, $user_id);
+ $credentials = $this->credentialMapper->getCredentialsByVaultId($vault_id, $user_id);
+ foreach ($credentials as $index => $credential) {
+ $credentials[$index] = $this->encryptService->decryptCredential($credential);
+ }
+ return $credentials;
}
/**
* Get a random credential from given vault
+ *
* @param $vault_id
* @param $user_id
* @return mixed
*/
public function getRandomCredentialByVaultId($vault_id, $user_id) {
$credentials = $this->credentialMapper->getRandomCredentialByVaultId($vault_id, $user_id);
+ foreach ($credentials as $index => $credential) {
+ $credentials[$index] = $this->encryptService->decryptCredential($credential);
+ }
return array_pop($credentials);
}
/**
* Get expired credentials.
+ *
* @param $timestamp
* @return \OCA\Passman\Db\Credential[]
*/
public function getExpiredCredentials($timestamp) {
- return $this->credentialMapper->getExpiredCredentials($timestamp);
+ $credentials = $this->credentialMapper->getExpiredCredentials($timestamp);
+ foreach ($credentials as $index => $credential) {
+ $credentials[$index] = $this->encryptService->decryptCredential($credential);
+ }
+ return $credentials;
}
/**
* Get a single credential.
+ *
* @param $credential_id
* @param $user_id
* @return Credential
* @throws DoesNotExistException
*/
- public function getCredentialById($credential_id, $user_id){
- $credential = $this->credentialMapper->getCredentialById($credential_id);
- if ($credential->getUserId() === $user_id){
- return $credential;
- }
- else {
- $acl = $this->sharingACL->getItemACL($user_id, $credential->getGuid());
- if ($acl->hasPermission(SharingACL::READ)) {
- return $credential;
+ public function getCredentialById($credential_id, $user_id) {
+ $credential = $this->credentialMapper->getCredentialById($credential_id);
+ if ($credential->getUserId() === $user_id) {
+ return $credential;
+ } else {
+ $acl = $this->sharingACL->getItemACL($user_id, $credential->getGuid());
+ if ($acl->hasPermission(SharingACL::READ)) {
+ return $this->encryptService->decryptCredential($credential);
+ } else {
+ throw new DoesNotExistException("Did expect one result but found none when executing");
}
- throw new DoesNotExistException("Did expect one result but found none when executing");
- }
+ }
}
/**
* Get credential label by credential id.
+ *
* @param $credential_id
* @return Credential
*/
- public function getCredentialLabelById($credential_id){
- return $this->credentialMapper->getCredentialLabelById($credential_id);
+ public function getCredentialLabelById($credential_id) {
+ $credential = $this->credentialMapper->getCredentialLabelById($credential_id);
+ return $this->encryptService->decryptCredential($credential);
}
/**
* Get credential by guid
+ *
* @param $credential_guid
* @param null $user_id
* @return Credential
*/
- public function getCredentialByGUID($credential_guid, $user_id = null){
- return $this->credentialMapper->getCredentialByGUID($credential_guid, $user_id);
- }
+ public function getCredentialByGUID($credential_guid, $user_id = null) {
+ $credential = $this->credentialMapper->getCredentialByGUID($credential_guid, $user_id);
+ return $this->encryptService->decryptCredential($credential);
+ }
} \ No newline at end of file
diff --git a/lib/Service/EncryptService.php b/lib/Service/EncryptService.php
new file mode 100644
index 00000000..31cc3448
--- /dev/null
+++ b/lib/Service/EncryptService.php
@@ -0,0 +1,399 @@
+<?php
+/**
+ * Nextcloud - passman
+ *
+ * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com)
+ * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es)
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Passman\Service;
+
+
+// Class copied from http://stackoverflow.com/questions/5089841/two-way-encryption-i-need-to-store-passwords-that-can-be-retrieved?answertab=votes#tab-top
+// Upgraded to use openssl
+use Icewind\SMB\Exception\Exception;
+use OCA\Passman\Db\Credential;
+use OCA\Passman\Db\File;
+
+/**
+ * A class to handle secure encryption and decryption of arbitrary data
+ *
+ * Note that this is not just straight encryption. It also has a few other
+ * features in it to make the encrypted data far more secure. Note that any
+ * other implementations used to decrypt data will have to do the same exact
+ * operations.
+ *
+ * Security Benefits:
+ *
+ * - Uses Key stretching
+ * - Hides the Initialization Vector
+ * - Does HMAC verification of source data
+ *
+ */
+class EncryptService {
+
+ /**
+ * Supported cipher algorithms accompanied by their key/block sizes in bytes
+ *
+ * OpenSSL has no equivalent of mcrypt_get_key_size() and mcrypt_get_block_size() hence sizes stored here.
+ *
+ * @var array
+ */
+ const SUPPORTED_ALGORITHMS = array(
+ 'aes-256-cbc' => array('name' => 'AES-256', 'keySize' => 32, 'blockSize' => 32),
+ 'bf' => array('name' => 'BF', 'keySize' => 16, 'blockSize' => 8),
+ 'des' => array('name' => 'DES', 'keySize' => 7, 'blockSize' => 8),
+ 'des-ede3' => array('name' => 'DES-EDE3', 'keySize' => 21, 'blockSize' => 8), // 3 different 56-bit keys
+ 'cast5' => array('name' => 'CAST5', 'keySize' => 16, 'blockSize' => 8),
+ );
+
+ const OP_ENCRYPT = 'encrypt';
+ const OP_DECRYPT = 'decrypt';
+
+ // The fields of a credential which are encrypted
+ public $encrypted_credential_fields = array(
+ 'description', 'username', 'password', 'files', 'custom_fields', 'otp', 'email', 'tags', 'url'
+ );
+
+ // Contains the server key
+ private $server_key;
+
+ /**
+ * @var string $cipher The openssl cipher to use for this instance
+ */
+ protected $cipher = '';
+
+ /**
+ * @var int $rounds The number of rounds to feed into PBKDF2 for key generation
+ */
+ protected $rounds = 100;
+
+ /**
+ * Constructor!
+ *
+ * @param SettingsService $settings
+ */
+ public function __construct(SettingsService $settings) {
+ $this->cipher = $settings->getAppSetting('server_side_encryption', 'aes-256-cbc');
+ $password_salt = \OC::$server->getConfig()->getSystemValue('passwordsalt', '');
+ $secret = \OC::$server->getConfig()->getSystemValue('secret', '');
+ $this->server_key = $password_salt . $secret;
+ $this->rounds = $settings->getAppSetting('rounds_pbkdf2_stretching', 100);
+ }
+
+ /**
+ * Create an encryption key. Based on given parameters
+ *
+ * @param string $userKey The user key to use. This should be specific to this user.
+ * @param string $serverKey The server key
+ * @param string $userSuppliedKey A key from the credential (eg guid, name or tags)
+ * @return string
+ */
+
+ public static function makeKey($userKey, $serverKey, $userSuppliedKey) {
+ $key = hash_hmac('sha512', $userKey, $serverKey);
+ $key = hash_hmac('sha512', $key, $userSuppliedKey);
+ return $key;
+ }
+
+ /**
+ * Get the maximum key size for the selected cipher and mode of operation
+ *
+ * @return int Value is in bytes
+ */
+ public function getKeySize() {
+ return EncryptService::SUPPORTED_ALGORITHMS[$this->cipher]['keySize'];
+ }
+
+ /**
+ * Decrypt the data with the provided key
+ *
+ * @param string $data_hex The encrypted datat to decrypt
+ * @param string $key The key to use for decryption
+ *
+ * @returns string|false The returned string if decryption is successful
+ * false if it is not
+ */
+ public function decrypt($data_hex, $key) {
+
+ if (!function_exists('hex2bin')) {
+ function hex2bin($str) {
+ $sbin = "";
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i += 2) {
+ $sbin .= pack("H*", substr($str, $i, 2));
+ }
+
+ return $sbin;
+ }
+ }
+
+ $data = hex2bin($data_hex);
+
+ $salt = substr($data, 0, 128);
+ $enc = substr($data, 128, -64);
+ $mac = substr($data, -64);
+
+ list ($cipherKey, $macKey, $iv) = $this->getKeys($salt, $key);
+
+ if (!$this->hash_equals(hash_hmac('sha512', $enc, $macKey, true), $mac)) {
+ return false;
+ }
+
+ $dec = openssl_decrypt($enc, $this->cipher, $cipherKey, true, $iv);
+ $data = $this->unpad($dec);
+
+ return $data;
+ }
+
+ /**
+ * Encrypt the supplied data using the supplied key
+ *
+ * @param string $data The data to encrypt
+ * @param string $key The key to encrypt with
+ *
+ * @returns string The encrypted data
+ */
+ public function encrypt($data, $key) {
+ if (function_exists('random_bytes')) {
+ $salt = random_bytes(128);
+ } else {
+ $salt = openssl_random_pseudo_bytes(128);
+ }
+ list ($cipherKey, $macKey, $iv) = $this->getKeys($salt, $key);
+ $data = $this->pad($data);
+ $enc = openssl_encrypt($data, $this->cipher, $cipherKey, true, $iv);
+ $mac = hash_hmac('sha512', $enc, $macKey, true);
+ $data = bin2hex($salt . $enc . $mac);
+ return $data;
+
+ }
+
+ /**
+ * Generates a set of keys given a random salt and a master key
+ *
+ * @param string $salt A random string to change the keys each encryption
+ * @param string $key The supplied key to encrypt with
+ *
+ * @returns array An array of keys (a cipher key, a mac key, and a IV)
+ */
+ protected function getKeys($salt, $key) {
+ $ivSize = openssl_cipher_iv_length($this->cipher);
+ $keySize = openssl_cipher_iv_length($this->cipher);
+ $length = 2 * $keySize + $ivSize;
+
+ $key = $this->pbkdf2('sha512', $key, $salt, $this->rounds, $length);
+
+ $cipherKey = substr($key, 0, $keySize);
+ $macKey = substr($key, $keySize, $keySize);
+ $iv = substr($key, 2 * $keySize);
+ return array($cipherKey, $macKey, $iv);
+ }
+
+ protected function hash_equals($a, $b) {
+ if (function_exists('random_bytes')) {
+ $key = random_bytes(128);
+ } else {
+ $key = openssl_random_pseudo_bytes(128);
+ }
+ return hash_hmac('sha512', $a, $key) === hash_hmac('sha512', $b, $key);
+ }
+
+ /**
+ * Stretch the key using the PBKDF2 algorithm
+ *
+ * @see http://en.wikipedia.org/wiki/PBKDF2
+ *
+ * @param string $algo The algorithm to use
+ * @param string $key The key to stretch
+ * @param string $salt A random salt
+ * @param int $rounds The number of rounds to derive
+ * @param int $length The length of the output key
+ *
+ * @returns string The derived key.
+ */
+ protected function pbkdf2($algo, $key, $salt, $rounds, $length) {
+ $size = strlen(hash($algo, '', true));
+ $len = ceil($length / $size);
+ $result = '';
+ for ($i = 1; $i <= $len; $i++) {
+ $tmp = hash_hmac($algo, $salt . pack('N', $i), $key, true);
+ $res = $tmp;
+ for ($j = 1; $j < $rounds; $j++) {
+ $tmp = hash_hmac($algo, $tmp, $key, true);
+ $res ^= $tmp;
+ }
+ $result .= $res;
+ }
+ return substr($result, 0, $length);
+ }
+
+ /**
+ * Pad the data with a random char chosen by the pad amount.
+ *
+ * @param $data
+ * @return string
+ */
+ protected function pad($data) {
+ $length = $this->getKeySize();
+ $padAmount = $length - strlen($data) % $length;
+ if ($padAmount === 0) {
+ $padAmount = $length;
+ }
+ return $data . str_repeat(chr($padAmount), $padAmount);
+ }
+
+
+ /**
+ * Unpad the the data
+ *
+ * @param $data
+ * @return bool|string
+ */
+ protected function unpad($data) {
+ $length = $this->getKeySize();
+ $last = ord($data[strlen($data) - 1]);
+ if ($last > $length) return false;
+ if (substr($data, -1 * $last) !== str_repeat(chr($last), $last)) {
+ return false;
+ }
+ return substr($data, 0, -1 * $last);
+ }
+
+
+ /**
+ * Encrypt a credential
+ *
+ * @param Credential|array $credential the credential to decrypt
+ * @return Credential|array
+ */
+ public function decryptCredential($credential) {
+ return $this->handleCredential($credential, EncryptService::OP_DECRYPT);
+ }
+
+ /**
+ * Encrypt a credential
+ *
+ * @param Credential|array $credential the credential to encrypt
+ * @return Credential|array
+ * @throws \Exception
+ */
+ public function encryptCredential($credential) {
+ return $this->handleCredential($credential, EncryptService::OP_ENCRYPT);
+ }
+
+
+ private function extractKeysFromCredential($credential) {
+ $userKey = '';
+ $userSuppliedKey = '';
+ if ($credential instanceof Credential) {
+ $userSuppliedKey = $credential->getLabel();
+ $sk = $credential->getSharedKey();
+ $userKey = (isset($sk)) ? $sk : $credential->getUserId();
+ }
+ if (is_array($credential)) {
+ $userSuppliedKey = $credential['label'];
+ $userKey = (isset($credential['shared_key'])) ? $credential['shared_key'] : $credential['user_id'];
+ }
+ return array($userKey, $userSuppliedKey);
+ }
+
+ /**
+ * Handles the encryption / decryption of a credential
+ *
+ * @param Credential|array $credential the credential to encrypt
+ * @return Credential|array
+ * @throws \Exception
+ */
+ private function handleCredential($credential, $service_function) {
+ list($userKey, $userSuppliedKey) = $this->extractKeysFromCredential($credential);
+
+ $key = $this->makeKey($userKey, $this->server_key, $userSuppliedKey);
+ foreach ($this->encrypted_credential_fields as $field) {
+ if ($credential instanceof Credential) {
+ $field = str_replace(' ', '', str_replace('_', ' ', ucwords($field, '_')));
+ $set = 'set' . $field;
+ $get = 'get' . $field;
+ $credential->{$set}($this->{$service_function}($credential->{$get}(), $key));
+ }
+
+ if (is_array($credential)) {
+ $credential[$field] = $this->{$service_function}($credential[$field], $key);
+ }
+ }
+ return $credential;
+ }
+
+ /**
+ * Encrypt a file
+ *
+ * @param File|array $file
+ * @return File|array
+ */
+
+ public function encryptFile($file) {
+ return $this->handleFile($file, EncryptService::OP_ENCRYPT);
+ }
+
+ /**
+ * Decrypt a file
+ *
+ * @param File|array $file
+ * @return File|array
+ */
+
+ public function decryptFile($file) {
+ return $this->handleFile($file, EncryptService::OP_DECRYPT);
+ }
+
+ /**
+ * Handles the encryption / decryption of a File
+ *
+ * @param File|array $file the credential to encrypt
+ * @return File|array
+ * @throws \Exception
+ */
+ private function handleFile($file, $service_function) {
+ $userKey = '';
+ $userSuppliedKey = '';
+ if ($file instanceof File) {
+ $userSuppliedKey = $file->getSize();
+ $userKey = md5($file->getMimetype());
+ }
+
+ if (is_array($file)) {
+ $userSuppliedKey = $file['size'];
+ $userKey = md5($file['mimetype']);
+ }
+
+ $key = $this->makeKey($userKey, $this->server_key, $userSuppliedKey);
+
+
+ if ($file instanceof File) {
+ $file->setFilename($this->{$service_function}($file->getFilename(), $key));
+ $file->setFileData($this->{$service_function}($file->getFileData(), $key));
+ }
+
+ if (is_array($file)) {
+ $file['filename'] = $this->{$service_function}($file['filename'], $key);
+ $file['file_data'] = $this->{$service_function}($file['file_data'], $key);
+ }
+
+ return $file;
+ }
+} \ No newline at end of file
diff --git a/lib/Service/FileService.php b/lib/Service/FileService.php
index 63da182a..d6257085 100644
--- a/lib/Service/FileService.php
+++ b/lib/Service/FileService.php
@@ -23,6 +23,7 @@
namespace OCA\Passman\Service;
+use OCA\Passman\Db\File;
use OCP\IConfig;
use OCP\AppFramework\Db\DoesNotExistException;
@@ -32,43 +33,55 @@ use OCA\Passman\Db\FileMapper;
class FileService {
private $fileMapper;
+ private $encryptService;
+ private $server_key;
- public function __construct(FileMapper $fileMapper) {
+ public function __construct(FileMapper $fileMapper, EncryptService $encryptService) {
$this->fileMapper = $fileMapper;
+ $this->encryptService = $encryptService;
+ $this->server_key = \OC::$server->getConfig()->getSystemValue('passwordsalt', '');
}
/**
* Get a single file. This function also returns the file content.
+ *
* @param $fileId
* @param null $userId
* @return \OCA\Passman\Db\File
*/
public function getFile($fileId, $userId = null) {
- return $this->fileMapper->getFile($fileId, $userId);
+ $file = $this->fileMapper->getFile($fileId, $userId);
+ return $this->encryptService->decryptFile($file);
}
/**
* Get a single file. This function also returns the file content.
+ *
* @param $file_guid
* @param null $userId
* @return \OCA\Passman\Db\File
*/
public function getFileByGuid($file_guid, $userId = null) {
- return $this->fileMapper->getFileByGuid($file_guid, $userId);
+ $file = $this->fileMapper->getFileByGuid($file_guid, $userId);
+ return $this->encryptService->decryptFile($file);
}
/**
* Upload a new file,
+ *
* @param $file array
* @param $userId
* @return \OCA\Passman\Db\File
*/
public function createFile($file, $userId) {
- return $this->fileMapper->create($file, $userId);
+ $file = $this->encryptService->encryptFile($file);
+ $file = $this->fileMapper->create($file, $userId);
+ return $this->getFile($file->getId());
}
/**
* Delete file
+ *
* @param $file_id
* @param $userId
* @return \OCA\Passman\Db\File
@@ -79,11 +92,13 @@ class FileService {
/**
* Update file
- * @param $file_id
+ *
+ * @param File $file
* @return \OCA\Passman\Db\File
*/
- public function updateFile($file_id) {
- return $this->fileMapper->updateFile($file_id);
+ public function updateFile($file) {
+ $file = $this->encryptService->encryptFile($file);
+ return $this->fileMapper->updateFile($file);
}
} \ No newline at end of file
diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php
index 813a994e..6aee268d 100644
--- a/lib/Service/SettingsService.php
+++ b/lib/Service/SettingsService.php
@@ -54,6 +54,8 @@ class SettingsService {
'check_version' => intval($this->config->getAppValue('passman', 'check_version', 1)),
'https_check' => intval($this->config->getAppValue('passman', 'https_check', 1)),
'disable_contextmenu' => intval($this->config->getAppValue('passman', 'disable_contextmenu', 1)),
+ 'server_side_encryption' => $this->config->getAppValue('passman', 'server_side_encryption', 'aes-256-cbc'),
+ 'rounds_pbkdf2_stretching' => $this->config->getAppValue('passman', 'rounds_pbkdf2_stretching', 100),
'settings_loaded' => 1
);
}
diff --git a/lib/Service/ShareService.php b/lib/Service/ShareService.php
index 02fe7aa5..8dec01db 100644
--- a/lib/Service/ShareService.php
+++ b/lib/Service/ShareService.php
@@ -39,17 +39,21 @@ class ShareService {
private $shareRequest;
private $credential;
private $revisions;
+ private $encryptService;
+
public function __construct(
SharingACLMapper $sharingACL,
ShareRequestMapper $shareRequest,
CredentialMapper $credentials,
- CredentialRevisionService $revisions
+ CredentialRevisionService $revisions,
+ EncryptService $encryptService
) {
$this->sharingACL = $sharingACL;
$this->shareRequest = $shareRequest;
$this->credential = $credentials;
$this->revisions = $revisions;
+ $this->encryptService = $encryptService;
}
/**
@@ -140,9 +144,10 @@ class ShareService {
foreach ($entries as $entry) {
// Check if the user can read the credential, probably unnecesary, but just to be sure
if (!$entry->hasPermission(SharingACL::READ)) continue;
-
$tmp = $entry->jsonSerialize();
- $tmp['credential_data'] = $this->credential->getCredentialById($entry->getItemId())->jsonSerialize();
+ $credential = $this->credential->getCredentialById($entry->getItemId());
+ $credential = $this->encryptService->decryptCredential($credential);
+ $tmp['credential_data'] = $credential->jsonSerialize();
if (!$entry->hasPermission(SharingACL::FILES)) unset($tmp['credential_data']['files']);
unset($tmp['credential_data']['shared_key']);
@@ -153,6 +158,7 @@ class ShareService {
/**
* Gets the acl for a given item guid
+ *
* @param $user_id
* @param $item_guid
* @return SharingACL
@@ -168,7 +174,10 @@ class ShareService {
if (!$acl->hasPermission(SharingACL::READ)) throw new DoesNotExistException("Item not found or wrong access level");
$tmp = $acl->jsonSerialize();
- $tmp['credential_data'] = $this->credential->getCredentialById($acl->getItemId())->jsonSerialize();
+ $credential = $this->credential->getCredentialById($acl->getItemId());
+ $credential = $this->encryptService->decryptCredential($credential);
+
+ $tmp['credential_data'] = $credential->jsonSerialize();
if (!$acl->hasPermission(SharingACL::FILES)) unset($tmp['credential_data']['files']);
unset($tmp['credential_data']['shared_key']);
@@ -191,31 +200,33 @@ class ShareService {
}
- /**
- * Deletes a share request by the item ID
- * @param ShareRequest $request
- * @return \PDOStatement
- */
+ /**
+ * Deletes a share request by the item ID
+ *
+ * @param ShareRequest $request
+ * @return \PDOStatement
+ */
public function cleanItemRequestsForUser(ShareRequest $request) {
return $this->shareRequest->cleanItemRequestsForUser($request->getItemId(), $request->getTargetUserId());
}
- /**
- * Get an share request by id
- * @param $id
- * @return ShareRequest
- */
+ /**
+ * Get an share request by id
+ *
+ * @param $id
+ * @return ShareRequest
+ */
public function getShareRequestById($id) {
return $this->shareRequest->getShareRequestById($id);
}
- /**
- * Get an share request by $item_guid and $target_vault_guid
- *
- * @param $item_guid
- * @param $target_vault_guid
- * @return ShareRequest
- */
+ /**
+ * Get an share request by $item_guid and $target_vault_guid
+ *
+ * @param $item_guid
+ * @param $target_vault_guid
+ * @return ShareRequest
+ */
public function getRequestByGuid($item_guid, $target_vault_guid) {
return $this->shareRequest->getRequestByItemAndVaultGuid($item_guid, $target_vault_guid);
}
@@ -275,11 +286,12 @@ class ShareService {
return $this->sharingACL->deleteShareACL($ACL);
}
- /**
- * Updates the given ACL entry
- * @param SharingACL $sharingACL
- * @return SharingACL
- */
+ /**
+ * Updates the given ACL entry
+ *
+ * @param SharingACL $sharingACL
+ * @return SharingACL
+ */
public function updateCredentialACL(SharingACL $sharingACL) {
return $this->sharingACL->updateCredentialACL($sharingACL);
}
@@ -300,7 +312,30 @@ class ShareService {
}
- public function updatePendingShareRequestsForCredential($item_guid, $user_id, $permissions){
- return $this->shareRequest->updatePendingRequestPermissions($item_guid, $user_id, $permissions);
- }
+ public function updatePendingShareRequestsForCredential($item_guid, $user_id, $permissions) {
+ return $this->shareRequest->updatePendingRequestPermissions($item_guid, $user_id, $permissions);
+ }
+
+ /**
+ * Clean up on credential destroyed.
+ * This will delete all ACL's and share requests.
+ * @param string $item_guid
+ */
+
+ public function unshareCredential($item_guid) {
+ $acl_list = $this->getCredentialAclList($item_guid);
+ $request_list = $this->getShareRequestsByGuid($item_guid);
+ foreach ($acl_list as $ACL) {
+ $this->deleteShareACL($ACL);
+ }
+ foreach ($request_list as $request) {
+ $this->deleteShareRequest($request);
+ $manager = \OC::$server->getNotificationManager();
+ $notification = $manager->createNotification();
+ $notification->setApp('passman')
+ ->setObject('passman_share_request', $request->getId())
+ ->setUser($request->getTargetUserId());
+ $manager->markProcessed($notification);
+ }
+ }
} \ No newline at end of file
diff --git a/lib/Service/VaultService.php b/lib/Service/VaultService.php
index 8e7a8d83..43e3a519 100644
--- a/lib/Service/VaultService.php
+++ b/lib/Service/VaultService.php
@@ -23,6 +23,7 @@
namespace OCA\Passman\Service;
+use OCA\Passman\Db\Vault;
use OCP\IConfig;
use OCP\AppFramework\Db\DoesNotExistException;
@@ -104,4 +105,16 @@ class VaultService {
public function updateSharingKeys($vault_id, $privateKey, $publicKey){
return $this->vaultMapper->updateSharingKeys($vault_id, $privateKey, $publicKey);
}
+
+ /**
+ * Delete a vault from user
+ * @param string $vault_guid
+ * @param string $user_id
+ */
+ public function deleteVault($vault_guid, $user_id){
+ $vault = $this->getByGuid($vault_guid, $user_id);
+ if($vault instanceof Vault) {
+ $this->vaultMapper->deleteVault($vault);
+ }
+ }
} \ No newline at end of file
diff --git a/migration/serversideencryption.php b/migration/serversideencryption.php
new file mode 100644
index 00000000..7ecc4371
--- /dev/null
+++ b/migration/serversideencryption.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * Nextcloud - passman
+ *
+ * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com)
+ * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es)
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Passman\Migration;
+
+use OCA\Passman\Db\CredentialRevision;
+use OCA\Passman\Db\File;
+use OCA\Passman\Service\CredentialRevisionService;
+use OCA\Passman\Service\CredentialService;
+use OCA\Passman\Service\EncryptService;
+use OCA\Passman\Service\FileService;
+use OCP\IDBConnection;
+use OCP\ILogger;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+
+
+class ServerSideEncryption implements IRepairStep {
+
+ /** @var EncryptService */
+ private $encryptService;
+
+ /** @var IDBConnection */
+ private $db;
+
+ /** @var string */
+ private $installedVersion;
+
+ /** @var ILogger */
+ private $logger;
+
+ /** @var CredentialService */
+ private $credentialService;
+
+ /** @var CredentialRevisionService */
+ private $revisionService;
+
+ /** @var FileService */
+ private $fileService;
+
+ public function __construct(EncryptService $encryptService, IDBConnection $db, ILogger $logger, CredentialService $credentialService, CredentialRevisionService $revisionService,
+ FileService $fileService) {
+ $this->encryptService = $encryptService;
+ $this->db = $db;
+ $this->logger = $logger;
+ $this->credentialService = $credentialService;
+ $this->revisionService = $revisionService;
+ $this->fileService = $fileService;
+ $this->installedVersion = \OC::$server->getConfig()->getAppValue('passman', 'installed_version');
+ }
+
+ public function getName() {
+ return 'Enabling server side encryption for passman';
+ }
+
+ public function run(IOutput $output) {
+ $output->info('Enabling Service Side Encryption for passman');
+
+ if (version_compare($this->installedVersion, '2.0.0RC4', '<')) {
+ $this->encryptCredentials();
+ $this->encryptRevisions();
+ $this->encryptFiles();
+ }
+ }
+
+ private function fetchAll($sql){
+ return $this->db->executeQuery($sql)->fetchAll();
+ }
+
+ private function encryptCredentials() {
+ $credentials = $this->fetchAll('SELECT * FROM `*PREFIX*passman_credentials`');
+ foreach ($credentials as $credential) {
+ $this->credentialService->updateCredential($credential);
+ }
+ }
+
+ private function encryptRevisions() {
+ $revisions = $this->fetchAll('SELECT * FROM `*PREFIX*passman_revisions`');
+ foreach ($revisions as $_revision) {
+ $revision = new CredentialRevision();
+ $revision->setId($_revision['id']);
+ $revision->setGuid($_revision['guid']);
+ $revision->setCredentialId($_revision['credential_id']);
+ $revision->setUserId($_revision['user_id']);
+ $revision->setCreated($_revision['created']);
+ $revision->setEditedBy($_revision['edited_by']);
+ $revision->setCredentialData($_revision['credential_data']);
+ $this->revisionService->updateRevision($revision);
+ }
+ }
+
+ private function encryptFiles() {
+ $files = $this->fetchAll('SELECT * FROM `*PREFIX*passman_files`');
+ foreach ($files as $_file) {
+ $file = new File();
+ $file->setId($_file['id']);
+ $file->setGuid($_file['guid']);
+ $file->setUserId($_file['user_id']);
+ $file->setMimetype($_file['minetype']);
+ $file->setFilename($_file['filename']);
+ $file->setSize($_file['size']);
+ $file->setCreated($_file['created']);
+ $file->setFileData($_file['file_data']);
+ $this->fileService->updateFile($file);
+ }
+ }
+}
diff --git a/templates/main.php b/templates/main.php
index dae84af9..85e78887 100644
--- a/templates/main.php
+++ b/templates/main.php
@@ -12,13 +12,13 @@ style('passman', 'passman.min');
?>
<div id="app" ng-app="passmanApp" ng-controller="MainCtrl">
-
+ <div id="logoutTimer"> </div>
<div class="warning_bar" ng-if="using_http && http_warning_hidden == false">
{{ 'http.warning' | translate }}
<i class="fa fa-times fa-2x" alt="Close" ng-click="setHttpWarning(true);"></i>
</div>
- <div id="app-navigation" ng-if="selectedVault" ng-controller="MenuCtrl">
+ <div id="app-navigation" ng-show="selectedVault" ng-controller="MenuCtrl">
<ul>
<li class="taginput">
<a class="taginput">
@@ -39,6 +39,7 @@ style('passman', 'passman.min');
</a>
</li>
</ul>
+
<div id="app-settings" ng-init="settingsShown = false;">
<div id="app-settings-header">
<button class="settings-button"
@@ -52,6 +53,9 @@ style('passman', 'passman.min');
<div><a class="link" ng-href="#/vault/{{active_vault.guid}}/settings">{{ 'settings' | translate }}</a></div>
<div><span class="link" ng-click="logout()">{{'logout' | translate }}</span></div>
<div><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6YS8F97PETVU2" target="_blank" class="link">{{ 'donate' | translate }}</a></div>
+ <div ng-show="session_time_left">
+ <small>{{'session.time.left' | translate:translationData}}</small>
+ </div>
</div>
</div>
</div>
diff --git a/templates/part.admin.php b/templates/part.admin.php
index ac5f4d2e..5aca8912 100644
--- a/templates/part.admin.php
+++ b/templates/part.admin.php
@@ -23,6 +23,7 @@ if ($checkVersion) {
$githubVersion = $version;
}
}
+$ciphers = openssl_get_cipher_methods();
?>
<div id="passwordSharingSettings" class="followup section">
@@ -30,7 +31,7 @@ if ($checkVersion) {
<h2><?php p($l->t('Passman Settings')); ?></h2>
<?php
if ($checkVersion) {
- p($l->t('Github version:'). ' '. $githubVersion);
+ p($l->t('Github version:') . ' ' . $githubVersion);
print '<br />';
} ?>
Local version: <?php p($localVersion); ?><br/>
@@ -52,7 +53,7 @@ if ($checkVersion) {
<p>
<input type="checkbox" name="passman_sharing_enabled"
id="passman_sharing_enabled" class="checkbox"
- value="1" />
+ value="1"/>
<label for="passman_sharing_enabled">
<?php p($l->t('Allow users on this server to share passwords with other users')); ?>
</label>
@@ -99,5 +100,17 @@ if ($checkVersion) {
</option>
</select>
</p>
+ <p>
+
+ <label for="server_side_encryption">Server side encryption
+ method:</label>
+ <select name="server_side_encryption2" id="server_side_encryption2">
+ <?php
+ foreach ($ciphers as $cipher) {
+ print '<option value="' . $cipher . '">' . $cipher . '</option>';
+ }
+ ?>
+ </select> (Not working atm. OpenSSL has no equivalent of <code>mcrypt_get_key_size()</code>)
+ </p>
</form>
</div>